我想遍历2D numpy数组(尤其是使用nditer),并保留迭代数组的维数。为此,我希望避免对迭代元素进行任何操作。该解决方案只能在迭代数组或迭代器上设置一次。
import numpy as np
X = np.random.randn(5, 2)
for row in X:
print(row.shape)
>>> (2,)
(2,)
(2,)
(2,)
(2,)
但是我希望拥有:
>> (1, 2)
(1, 2)
(1, 2)
(1, 2)
(1, 2)
我想找到一种解决方案,该解决方案只能应用一次,不能应用于row = row.reshape(1,-1)
之类的每一行。
答案 0 :(得分:0)
在数组上进行迭代就像在列表列表上进行迭代一样-它返回在第一维上索引的元素:
In [48]: X = np.random.randn(5, 2)
In [49]: X[0,:]
Out[49]: array([0.59964924, 0.46057338])
In [50]: for row in X:print(row)
[0.59964924 0.46057338]
[1.09308258 0.06495922]
[ 0.98928476 -1.07894574]
[-1.31303644 -0.34589506]
[0.31475676 0.3003112 ]
您可以迭代索引,并使用列表索引:
In [51]: for i in range(X.shape[0]): print(X[[i],:])
[[0.59964924 0.46057338]]
[[1.09308258 0.06495922]]
[[ 0.98928476 -1.07894574]]
[[-1.31303644 -0.34589506]]
[[0.31475676 0.3003112 ]]
X[[1]]
,X[1:2]
,X[1][None,:]
,X[None,1]
都一样。
我认为没有办法将那些直接合并到
for ... in X:
表达式。
nditer
可能很难使用。通常,它在元素级别而不是“行”级别进行迭代,从而为我们提供0d数组。而且它的速度并不比for
迭代快。因此,我认为这里没有用。
====
建议链接Numpy index slice without losing dimension information启发了我尝试:
In [57]: for row in X[:,None]: print(row)
[[0.59964924 0.46057338]]
[[1.09308258 0.06495922]]
[[ 0.98928476 -1.07894574]]
[[-1.31303644 -0.34589506]]
[[0.31475676 0.3003112 ]]
实际上,我将X
转换为(5,1,2)数组,因此在第一维上的迭代会生成(1,2)元素。我没有添加尺寸,而是添加了尺寸。