[英]How to iterate over a numpy array at a given axis?
我有一个形状的ndarray
my_array = np.zeros((Na, Nb, Nc))
我有Nb束形状数据(Na,Nc)
我想用我的数据束填充“ my_array”,如下所示:
for b, bit in zip(range(Nb), my_bits):
my_array[:, b, :] = bit
但是我想对任意形状数据集的任意仲裁轴进行此操作。 我该怎么做?
**编辑**有人指出我的问题含糊不清。 下面是我知道如何做的示例代码,导致了我不知道的事情。
我知道的:
my_bits = [np.ones((Na, Nc)) for j in range(Nb)]
my_array = np.zeros((Na, Nb, Nc))
for b, bit in zip(range(Nb), my_bits):
my_array[:, b, :] = bit
一般而言,我们可以考虑
my_array = np.zeros((N1, N2, ..., Nj, ..., Nmax))
bit = np.ones((N1, N2, ..., Nj-1, Nj+1, ..., Nmax))
my_bits = [bit]*Nj
从那里,我想沿轴Nj用my_bits填充my_array。 我该怎么做? 我正在查看nditer函数,但不确定如何处理。
这里的尺寸有问题。 如果我正确理解, my_array[:, 0, :]
my_bits
my_array[:, 0, :]
与my_bits
维数相同。 所以分配应该像这样完成:
import numpy as np
Na = 2
Nb = 2
Nc = 2
my_array = np.zeros((Na, Nb, Nc))
my_bits = np.ones((Na, Nc))
print('my_array before', my_array)
for b in range(Nb):
my_array[:, b, :] = my_bits
print('my_array after', my_array)
我认为您可能想要numpy.transpose
list_of_2d_arrays = [ make_2d_array() for i in range(Nb) ] # each has shape=(Na,Nc)
tensor3d = np.array(list_of_2d_arrays) # shape = (Nb,Na,Nc)
# now shift the dimensions around
X = np.transpose(tensor3d,(1,0,2)) # has shape (Na,Nb,Nc)
在某些numpy
函数中,使用transpose
将迭代轴移动到已知位置(最前面或最后一个)。
另一种方法是构造一个slice
对象,并对其进行迭代。
In [46]: arr = np.zeros((2,3,4),int)
In [47]: idx = np.full((arr.ndim,), slice(None))
In [48]: n=2
In [49]: for i in range(arr.shape[n]):
...: idx[n] = i
...: arr[tuple(idx)] = i+1
...:
In [50]: arr
Out[50]:
array([[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]],
[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]])
对于另一个轴
In [56]: arr = np.zeros((2,3,4),int)
In [57]: idx = np.full((arr.ndim,), slice(None))
In [58]: n=1
In [59]: for i in range(arr.shape[n]):
...: idx[n] = i
...: arr[tuple(idx)] = i+1
...:
In [60]: arr
Out[60]:
array([[[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]],
[[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]]])
在这种情况下, idx
变化如下:
[slice(None, None, None) 0 slice(None, None, None)]
[slice(None, None, None) 1 slice(None, None, None)]
[slice(None, None, None) 2 slice(None, None, None)]
关键是索引表达式具有等效的元组,可以通过编程方式构造它:
In [61]: np.s_[:,3,:]
Out[61]: (slice(None, None, None), 3, slice(None, None, None))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.