4

我已经定义了对3xN NumPy数组的操作,我想遍历数组的每一列。

我试过了:

for i in range(nparray.shape[1]):

但是,如果nparray.ndim == 1,则失败。

有没有一种干净的方法来确定数组的列数NumPy,例如,1如果它是一个1D数组(就像 MATLAB 的size操作一样)?

否则,我已经实施:

if nparray.ndim == 1:
    num_points = 1
else:
    num_points = nparray.shape[1]

for i in range(num_points):
4

4 回答 4

5

如果你只是在寻找不那么冗长的东西,你可以这样做:

num_points = np.atleast_2d(nparray).shape[1]

当然,这将创建一个新的临时数组来形成它的形状,这有点傻……但它会很便宜,因为它只是相同内存的视图。

但是,我认为您的显式代码更具可读性,除非我可以使用try

try:
    num_points = nparray.shape[1]
except IndexError:
    num_points = 1

如果你重复这样做,无论你做什么,你都应该把它包装在一个函数中。例如:

def num_points(arr, axis):
    try:
        return arr.shape[axis]
    except IndexError:
        return 1

那么你只需要写:

for i in range(num_points(nparray, 1)):

当然,这意味着你可以通过编辑一个地方来改变任何地方,例如:

def num_points(arr, axis):
    return nparray[:,...,np.newaxis].shape[1]
于 2013-08-23T21:42:38.427 回答
4

如果你想保持单线,使用条件表达式怎么样:

for i in range(nparray.shape[1] if nparray.ndim > 1 else 1):
    pass
于 2013-08-23T22:01:01.867 回答
0

默认情况下,迭代一种np.array对行进行迭代的方法。如果您必须遍历列,只需遍历转置数组:

>>> a2=array(range(12)).reshape((3,4))
>>> for col in a2.T:
    print col

[0 4 8]
[1 5 9]
[ 2  6 10]
[ 3  7 11]

数组的预期行为是什么array([1,2,3]),它被视为具有一列或具有 3 个列?令人困惑的是,您提到数组都是 3XN 数组,这意味着这应该是预期的行为,因为它应该被视为只有 1 列:

>>> a1=array(range(3))
>>> for col in a1.reshape((3,-1)).T:
print col

[0 1 2]

所以,一个通用的解决方案:for col in your_array.reshape((3,-1)).T: #do something

于 2013-08-23T23:54:12.060 回答
0

我认为最简单的方法是使用该len功能:

for i in range(len(nparray)):
   ...

为什么?因为如果 nparray 的个数是一个类似一维向量,len将返回元素的个数。在您的情况下,列数。

nparray = numpy.ones(10)
print(len(nparray))
Out: 10

如果 nparray 类似于矩阵,则将返回列数。

nparray = numpy.ones((10, 5))
print(len(nparray))
Out: 10

如果您有一个不同大小的 numpy 数组列表,只需len根据您的列表在循环中使用。

于 2021-03-31T13:00:56.817 回答