如何迭代Python中可能是一维的矩阵?

时间:2015-11-18 21:07:34

标签: python arrays numpy matrix

假设你有这样的矩阵:

a = [['a','b','c','d'],
     ['e','f','g','h']]

b = np.empty((0,4),int)

我想要一些行(如果它们满足我在实际代码中检查的某些条件)并将它们堆叠在b上。我正在做类似的事情:

for element in a:
   b = np.vstack((b, a)) 

但矩阵a可能是一维的。说:

a = ['a','b','c','d']

这可能发生在我的情况下,因为我是从用户编写的csv

生成的

然后,迭代a会在我尝试vstack时导致错误,因为每个'元素'是'a','b','c'和'd',因此堆叠的尺寸不匹配。这就像试图做的那样:

b = np.vstack(('a', a))

处理这样的事情的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

没有必要迭代数组的行以将它们堆叠到b,因为vstack单独工作正常。考虑:

a_1 = [['a','b','c','d'],
       ['e','f','g','h']]

a_2 = ['a', 'b', 'c', 'd']

b = np.empty((0,4),int)

然后

>>> np.vstack((b, a_1))
array([['a', 'b', 'c', 'd'],
       ['e', 'f', 'g', 'h']], 
      dtype='<U21')

>>> np.vstack((b, a_2))
array([['a', 'b', 'c', 'd']], 
      dtype='<U21')

答案 1 :(得分:0)

由于基本操作是在每一行上操作&#39;在a中,使用atleast_2d确保a具有二维维度。在内部,它的代码很简单,值得研究。

然后我不建议每次迭代执行vstack,而是建议附加到列表中,只做一个堆栈。

def foo(a):
    a = np.atleast_2d(a)
    for row in a:
        # <do something to row>
        b.append(row)
    return np.vstack(b)

试验:

In [45]: foo(np.ones((2,3)))
Out[45]: 
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
In [46]: foo(np.ones((3)))
Out[46]: array([[ 1.,  1.,  1.]])
In [47]: foo(np.ones((1,3)))
Out[47]: array([[ 1.,  1.,  1.]])

附加到列表然后执行数组连接或创建是常见的numpy实践。另一种方法是定义一个正确目标大小的空数组,并插入新值。这需要一个迭代索引。

在这种情况下atleast_2d的本质是:

if len(a.shape) == 1:
     a = a[newaxis,:]

它更加通用,允许我使用foo(3)并返回array([[3]])