我这样做:
>> E = [];
>> A = [1 2 3 4 5; 10 20 30 40 50];
>> E = [E ; A]
E =
1 2 3 4 5
10 20 30 40 50
现在我想在Numpy做同样的事情,但我有问题,看看这个:
>>> E = array([],dtype=int)
>>> E
array([], dtype=int64)
>>> A = array([[1,2,3,4,5],[10,20,30,40,50]])
>>> E = vstack((E,A))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/shape_base.py", line 226, in vstack
return _nx.concatenate(map(atleast_2d,tup),0)
ValueError: array dimensions must agree except for d_0
当我这样做时,我有类似的情况:
>>> E = concatenate((E,A),axis=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: arrays must have same number of dimensions
或者:
>>> E = append([E],[A],axis=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/function_base.py", line 3577, in append
return concatenate((arr, values), axis=axis)
ValueError: arrays must have same number of dimensions
答案 0 :(得分:64)
如果您事先知道列数:
>>> xs = np.array([[1,2,3,4,5],[10,20,30,40,50]])
>>> ys = np.array([], dtype=np.int64).reshape(0,5)
>>> ys
array([], shape=(0, 5), dtype=int64)
>>> np.vstack([ys, xs])
array([[ 1., 2., 3., 4., 5.],
[ 10., 20., 30., 40., 50.]])
如果不是:
>>> ys = np.array([])
>>> ys = np.vstack([ys, xs]) if ys.size else xs
array([[ 1, 2, 3, 4, 5],
[10, 20, 30, 40, 50]])
答案 1 :(得分:1)
我为解决此类问题而构建的东西。它还处理list
输入而不是np.array
:
import numpy as np
def cat(tupleOfArrays, axis=0):
# deals with problems of concating empty arrays
# also gives better error massages
# first check that the input is correct
assert isinstance(tupleOfArrays, tuple), 'first var should be tuple of arrays'
firstFlag = True
res = np.array([])
# run over each element in tuple
for i in range(len(tupleOfArrays)):
x = tupleOfArrays[i]
if len(x) > 0: # if an empty array\list - skip
if isinstance(x, list): # all should be ndarray
x = np.array(x)
if x.ndim == 1: # easier to concat 2d arrays
x = x.reshape((1, -1))
if firstFlag: # for the first non empty array, just swich the empty res array with it
res = x
firstFlag = False
else: # actual concatination
# first check that concat dims are good
if axis == 0:
assert res.shape[1] == x.shape[1], "Error concating vertically element index " + str(i) + \
" with prior elements: given mat shapes are " + \
str(res.shape) + " & " + str(x.shape)
else: # axis == 1:
assert res.shape[0] == x.shape[0], "Error concating horizontally element index " + str(i) + \
" with prior elements: given mat shapes are " + \
str(res.shape) + " & " + str(x.shape)
res = np.concatenate((res, x), axis=axis)
return res
if __name__ == "__main__":
print(cat((np.array([]), [])))
print(cat((np.array([1, 2, 3]), np.array([]), [1, 3, 54+1j]), axis=0))
print(cat((np.array([[1, 2, 3]]).T, np.array([]), np.array([[1, 3, 54+1j]]).T), axis=1))
print(cat((np.array([[1, 2, 3]]).T, np.array([]), np.array([[3, 54]]).T), axis=1)) # a bad one
答案 2 :(得分:1)
如果您只是因为无法在循环中将数组与已初始化的空数组连接而想要这样做,则只需使用条件语句, 例如
if (i == 0):
do the first assignment
else:
start your contactenate
答案 3 :(得分:0)
在Python中,如果可以使用单个向量,则应使用list .append()
>>> E = []
>>> B = np.array([1,2,3,4,5])
>>> C = np.array([10,20,30,40,50])
>>> E = E.append(B)
>>> E = E.append(C)
[array([1, 2, 3, 4, 5]), array([10, 20, 30, 40, 50])]
,然后在完成所有附加操作之后,立即返回np.array
>>> E = np.array(E)
array([[ 1, 2, 3, 4, 5],
[10, 20, 30, 40, 50]])
答案 4 :(得分:0)
E = np.array([
]).reshape(0, 5)
print("E: \n{}\nShape {}\n".format(E, E.shape))
A = np.vstack([
[1, 2, 3, 4, 5],
[10, 20, 30, 40, 50]]
)
print("A:\n{}\nShape {}\n".format(A, A.shape))
C = np.r_[
E,
A
].astype(np.int32)
print("C:\n{}\nShape {}\n".format(C, C.shape))
E:
[]
Shape (0, 5)
A:
[[ 1 2 3 4 5]
[10 20 30 40 50]]
Shape (2, 5)
C:
[[ 1 2 3 4 5]
[10 20 30 40 50]]
Shape (2, 5)
答案 5 :(得分:-5)
np.concatenate
,np.hstack
和np.vstack
会做你想要的。但请注意,NumPy数组不适合用作动态数组。为此目的使用Python列表。