假设你有这样的矩阵:
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))
处理这样的事情的最佳方法是什么?
答案 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]])
。