迭代numpy数组并保持维数

2024-04-25 00:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想迭代一个2dnumpy数组(特别是使用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)这样的每一行。你知道吗


Tags: inimportnumpy元素for过程asnp
1条回答
网友
1楼 · 发布于 2024-04-25 00:19:20

在数组上迭代类似于在列表列表上迭代-它返回第一个维度上索引的元素:

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使用起来可能很笨拙。通常,它在元素级别进行迭代,而不是在“row”级别,从而得到一个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)个元素。我没有保留一个维度,而是添加了一个维度。你知道吗

相关问题 更多 >