我有一个2d numpy数组(shape(y,x)=601,1200)
和一个3d numpy数组(shape(z,y,x)=137,601,1200)
。
在2d数组中,我将z
值保存在y, x
点,现在我想从3d数组访问该值并将其保存到新的2d数组中。
我尝试了类似的尝试,但没有成功。
levels = array2d.reshape(-1)
y = np.arange(601)
x = np.arange(1200)
newArray2d=oldArray3d[levels,y,x]
IndexError:形状不匹配:索引数组无法与形状(721200,)(601,)(1200,)一起广播
我不想尝试使用循环,所以有没有更快的方法?
答案 0 :(得分:0)
您的问题中有些含糊,但我想您想像这样进行高级索引编制:
In [2]: arr = np.arange(24).reshape(4,3,2)
In [3]: levels = np.random.randint(0,4,(3,2))
In [4]: levels
Out[4]:
array([[1, 2],
[3, 1],
[0, 2]])
In [5]: arr
Out[5]:
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15],
[16, 17]],
[[18, 19],
[20, 21],
[22, 23]]])
In [6]: arr[levels, np.arange(3)[:,None], np.arange(2)]
Out[6]:
array([[ 6, 13],
[20, 9],
[ 4, 17]])
levels
是(3,2)。我创建了其他两个索引数组,它们分别与它们一起广播(3,1)和(2,)。结果是arr
中的(3,2)个值数组,由它们的组合索引选择。
答案 1 :(得分:0)
这是您拥有的数据:
x_len = 12 # In your case, 1200
y_len = 6 # In your case, 601
z_len = 3 # In your case, 137
import numpy as np
my2d = np.random.randint(0,z_len,(y_len,x_len))
my3d = np.random.randint(0,5,(z_len,y_len,x_len))
这是构建新2d数组的一种方法:
yindices,xindices = np.indices(my2d.shape)
new2d = my3d[my2d[:], yindices, xindices]
注释:
my3d
进行索引。reshape(-1)
重塑2d形状,因为我们传递的整数索引数组的形状将(在任何广播之后)变成所得2d数组的形状。 / li>
(y_len,1)
和(1, x_len)
。请注意1
的不同位置。这样可以确保广播这两个索引数组