如何将 numpy 切片混合到索引列表中?
How to mix numpy slices to list of indices?
我有一个 numpy.array
,名为 grid
,形状为:
grid.shape = [N, M_1, M_2, ..., M_N]
N、M_1、M_2、...、M_N的值只有在初始化后才知道。
对于这个例子,假设 N=3 和 M_1 = 20,M_2 = 17,M_3 = 9:
grid = np.arange(3*20*17*9).reshape(3, 20, 17, 9)
我正在尝试遍历这个数组,如下所示:
for indices, val in np.ndenumerate(grid[0]):
print indices
_some_func_with_N_arguments(*grid[:, indices])
在第一次迭代中,indices = (0, 0, 0) and:
grid[:, indices] # array with shape 3,3,17,9
而我希望它只是三个元素的数组,很像:
grid[:, indices[0], indices[1], indices[2]] # array([ 0, 3060, 6120])
但是我不能像上面那行那样实现,因为我不知道 indices
.
的长度是多少
我正在使用 python 2.7,但欢迎使用与版本无关的实现:-)
我相信你要找的是grid[1:][grid[0]]
。
grid = np.array([
[0, 2, 1], # N
[1, 9, 3, 6], # M_1
[7, 8, 2, 5, 0, 8, 3], # M_2
[4, 8] # M_3
])
np.array([grid[a[0] + 1][n] for a, n in np.ndenumerate(grid[0])])
# array([1, 2, 8])
您可以手动添加 slice(None)
到索引元组:
>>> grid.shape
(3, 20, 17, 9)
>>> indices
(19, 16, 8)
>>> grid[:,19,16,8]
array([3059, 6119, 9179])
>>> grid[(slice(None),) + indices]
array([3059, 6119, 9179])
有关详细信息,请参阅文档中的 here。
我想你想要这样的东西:
In [134]: x=np.arange(24).reshape(4,3,2)
In [135]: x
Out[135]:
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 [136]: for i,j in np.ndindex(x[0].shape):
...: print(i,j,x[:,i,j])
...:
(0, 0, array([ 0, 6, 12, 18]))
(0, 1, array([ 1, 7, 13, 19]))
(1, 0, array([ 2, 8, 14, 20]))
(1, 1, array([ 3, 9, 15, 21]))
(2, 0, array([ 4, 10, 16, 22]))
(2, 1, array([ 5, 11, 17, 23]))
第一行是:
In [142]: x[:,0,0]
Out[142]: array([ 0, 6, 12, 18])
将索引元组解包为 i,j
并在 x[:,i,j]
中使用它是执行此索引的最简单方法。但是要将其推广到其他维数,我将不得不稍微玩一下元组。 x[i,j]
与 x[(i,j)]
相同。
In [147]: for ind in np.ndindex(x.shape[1:]):
...: print(ind,x[(slice(None),)+ind])
...:
((0, 0), array([ 0, 6, 12, 18]))
((0, 1), array([ 1, 7, 13, 19]))
...
与 enumerate
:
for ind,val in np.ndenumerate(x[0]):
print(ind,x[(slice(None),)+ind])
我有一个 numpy.array
,名为 grid
,形状为:
grid.shape = [N, M_1, M_2, ..., M_N]
N、M_1、M_2、...、M_N的值只有在初始化后才知道。
对于这个例子,假设 N=3 和 M_1 = 20,M_2 = 17,M_3 = 9:
grid = np.arange(3*20*17*9).reshape(3, 20, 17, 9)
我正在尝试遍历这个数组,如下所示:
for indices, val in np.ndenumerate(grid[0]):
print indices
_some_func_with_N_arguments(*grid[:, indices])
在第一次迭代中,indices = (0, 0, 0) and:
grid[:, indices] # array with shape 3,3,17,9
而我希望它只是三个元素的数组,很像:
grid[:, indices[0], indices[1], indices[2]] # array([ 0, 3060, 6120])
但是我不能像上面那行那样实现,因为我不知道 indices
.
我正在使用 python 2.7,但欢迎使用与版本无关的实现:-)
我相信你要找的是grid[1:][grid[0]]
。
grid = np.array([
[0, 2, 1], # N
[1, 9, 3, 6], # M_1
[7, 8, 2, 5, 0, 8, 3], # M_2
[4, 8] # M_3
])
np.array([grid[a[0] + 1][n] for a, n in np.ndenumerate(grid[0])])
# array([1, 2, 8])
您可以手动添加 slice(None)
到索引元组:
>>> grid.shape
(3, 20, 17, 9)
>>> indices
(19, 16, 8)
>>> grid[:,19,16,8]
array([3059, 6119, 9179])
>>> grid[(slice(None),) + indices]
array([3059, 6119, 9179])
有关详细信息,请参阅文档中的 here。
我想你想要这样的东西:
In [134]: x=np.arange(24).reshape(4,3,2)
In [135]: x
Out[135]:
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 [136]: for i,j in np.ndindex(x[0].shape):
...: print(i,j,x[:,i,j])
...:
(0, 0, array([ 0, 6, 12, 18]))
(0, 1, array([ 1, 7, 13, 19]))
(1, 0, array([ 2, 8, 14, 20]))
(1, 1, array([ 3, 9, 15, 21]))
(2, 0, array([ 4, 10, 16, 22]))
(2, 1, array([ 5, 11, 17, 23]))
第一行是:
In [142]: x[:,0,0]
Out[142]: array([ 0, 6, 12, 18])
将索引元组解包为 i,j
并在 x[:,i,j]
中使用它是执行此索引的最简单方法。但是要将其推广到其他维数,我将不得不稍微玩一下元组。 x[i,j]
与 x[(i,j)]
相同。
In [147]: for ind in np.ndindex(x.shape[1:]):
...: print(ind,x[(slice(None),)+ind])
...:
((0, 0), array([ 0, 6, 12, 18]))
((0, 1), array([ 1, 7, 13, 19]))
...
与 enumerate
:
for ind,val in np.ndenumerate(x[0]):
print(ind,x[(slice(None),)+ind])