【问题标题】:Iterate numpy array and keep dimensions迭代numpy数组并保持维度
【发布时间】:2019-05-21 09:58:03
【问题描述】:

我想遍历一个 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) 这样的每一行。

【问题讨论】:

标签: python loops numpy


【解决方案1】:

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

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) 元素。我没有保留维度,而是添加了一个维度。

【讨论】:

  • 谢谢@hpaulj! for row in X[:,None]: print(row) 正是我想要的。我尝试了一些替代方法,例如 X[:, :, np.newaxis],但我得到了错误的形状,即 (2,1) 而不是 (1,2)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2018-10-12
  • 1970-01-01
  • 2011-12-28
相关资源
最近更新 更多