numpy 使用变量“start”从np.linspace生成np.meshgrid

vxqlmq5t  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(113)

设x在(0,1)范围内,y在(x,1)范围内,z在(0,1)范围内。如何生成3X 3X 3的均匀间隔网格?请注意,y的下限/起始值取决于x。如果y在(0,1)范围内,问题会很容易解决。
我尝试使用x=np.linspace(0,1,3); y=np.linspace(x,1,3); z=np.linspace(0,1,3),然后使用np.meshgrid(x,y,z),但它并不像预期的那样工作--生成了一些数组,但维数不正确。

dfty9e19

dfty9e191#

以下内容似乎产生了预期的结果。

import numpy as np

x = np.linspace(0,1,3)
y = np.linspace(0,1,5)
z = np.linspace(0,1,3)

X,Y,Z = np.meshgrid(x,y,z)

indices = np.nonzero(X <= Y)

X = X[indices].reshape([3,3,3])
Y = Y[indices].reshape([3,3,3])
Z = Z[indices].reshape([3,3,3])

字符串
一般来说,对于一个n x n x n网格,应该取y = np.linspace(0,1,2*n - 1)

23c0lvtd

23c0lvtd2#

在我看来,这个问题是不明确的。我们需要看到你想要的实际数字。和代码,即使它不是漂亮的'数组'的东西。
但是让x和y,z增加了一个维度,但没有改变任何重要的东西。

In [43]: x=np.linspace(0,1,3); y=np.linspace(x,1,3)

In [44]: x
Out[44]: array([0. , 0.5, 1. ])

In [45]: y
Out[45]: 
array([[0.  , 0.5 , 1.  ],
       [0.5 , 0.75, 1.  ],
       [1.  , 1.  , 1.  ]])

字符串
x是一个简单的3个元素的一维数组。
y是(3,3),x的每个起始点对应一行。

In [46]: np.meshgrid(x,y, indexing='ij')
Out[46]: 
[array([[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
        [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],
        [1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ]]),
 array([[0.  , 0.5 , 1.  , 0.5 , 0.75, 1.  , 1.  , 1.  , 1.  ],
        [0.  , 0.5 , 1.  , 0.5 , 0.75, 1.  , 1.  , 1.  , 1.  ],
        [0.  , 0.5 , 1.  , 0.5 , 0.75, 1.  , 1.  , 1.  , 1.  ]])]


这是两个形状为(3,9)的数组。我预计meshgrid会产生一个关于y不是1d的错误,但看起来它反而变平了。
注意,第一个的所有行都是相同的,第二个的所有列都是相同的,这就是meshgrid的本质。
本的
本建议(在我的2D版本)

In [49]: I,J=np.meshgrid(x,np.linspace(0,1,5), indexing='ij')

In [50]: I,J
Out[50]: 
(array([[0. , 0. , 0. , 0. , 0. ],
        [0.5, 0.5, 0.5, 0.5, 0.5],
        [1. , 1. , 1. , 1. , 1. ]]),
 array([[0.  , 0.25, 0.5 , 0.75, 1.  ],
        [0.  , 0.25, 0.5 , 0.75, 1.  ],
        [0.  , 0.25, 0.5 , 0.75, 1.  ]]))

In [51]: indices = np.nonzero(I <= J)

In [53]: indices
Out[53]: 
(array([0, 0, 0, 0, 0, 1, 1, 1, 2], dtype=int64),
 array([0, 1, 2, 3, 4, 2, 3, 4, 4], dtype=int64))

In [54]: I[indices]
Out[54]: array([0. , 0. , 0. , 0. , 0. , 0.5, 0.5, 0.5, 1. ])

In [55]: I[indices].reshape(3,3)
Out[55]: 
array([[0. , 0. , 0. ],
       [0. , 0. , 0.5],
       [0.5, 0.5, 1. ]])

In [56]: J[indices].reshape(3,3)
Out[56]: 
array([[0.  , 0.25, 0.5 ],
       [0.75, 1.  , 0.5 ],
       [0.75, 1.  , 1.  ]])


这些价值观没有多大意义。
即使没有“indices ='ij”,结果看起来也没有更合理

In [60]: I[indices].reshape(3,3)
Out[60]: 
array([[0. , 0. , 0. ],
       [0.5, 0. , 0.5],
       [0. , 0.5, 1. ]])

In [61]: J[indices].reshape(3,3)
Out[61]: 
array([[0.  , 0.25, 0.5 ],
       [0.5 , 0.75, 0.75],
       [1.  , 1.  , 1.  ]])

tril

这听起来有点像你想要一个下三角形或上三角形。这是一个有些值被设置为零(或可能nan?)

In [70]: I,J=np.meshgrid(x,x, indexing='ij');I,J
Out[70]: 
(array([[0. , 0. , 0. ],
        [0.5, 0.5, 0.5],
        [1. , 1. , 1. ]]),
 array([[0. , 0.5, 1. ],
        [0. , 0.5, 1. ],
        [0. , 0.5, 1. ]]))

In [71]: np.tril(I)
Out[71]: 
array([[0. , 0. , 0. ],
       [0.5, 0.5, 0. ],
       [1. , 1. , 1. ]])

In [72]: np.tril(J)
Out[72]: 
array([[0. , 0. , 0. ],
       [0. , 0.5, 0. ],
       [0. , 0.5, 1. ]])


还是用楠填

In [77]: I1=np.ones((3,3))*np.nan; I1[indices]=I[indices]; I1
Out[77]: 
array([[0. , nan, nan],
       [0.5, 0.5, nan],
       [1. , 1. , 1. ]])

In [78]: J1=np.ones((3,3))*np.nan; J1[indices]=J[indices]; J1
Out[78]: 
array([[0. , nan, nan],
       [0. , 0.5, nan],
       [0. , 0.5, 1. ]])

稀疏网格

meshgrid可以是一般的sparse值,在广播的情况下,其行为与2d密集

In [79]: I,J=np.meshgrid(x,x,sparse=True);I,J
Out[79]: 
(array([[0. , 0.5, 1. ]]),
 array([[0. ],
        [0.5],
        [1. ]]))

In [80]: I+J
Out[80]: 
array([[0. , 0.5, 1. ],
       [0.5, 1. , 1.5],
       [1. , 1.5, 2. ]])

你的元组?

从注解中,我推断出您需要7个元组(忽略z

((0, 0), (0, 0.5), (0, 1), 
(0.5, 0.5), (0.5, 0.75), (0.5, 1), 
(1, 1))


这就像一个上/下tri,但是您添加了(0.5, 0.75)
或者这些可以从我的[44]和[45]中收集,跳过[45]中重复的1。

mzsu5hc0

mzsu5hc03#

经过几天的研究,numpy中与“mesh”相关的函数似乎被设计为(仅)创建方形网格。如果需要生成一个奇怪形状的网格,比如我的例子中的三角形,可以首先生成一个方形网格,然后使用索引来“静音”三角形之外的网格,或者简单地编写一个n嵌套循环,其中n是涉及的变量数量。
简单地说,像meshgrid这样的函数不是为了生成正方形以外的形状的网格而设计的。

相关问题