我正在尝试向空的NumPy数组中添加新列,并且遇到了一些麻烦。我看了很多其他问题,但是由于某些原因,它们似乎并不能帮助我解决我所面临的问题,所以我决定问自己一个问题。
我有一个空的NumPy数组,例如:
array1 = np.array([])
比方说,我有(100, 100)
形状的数据,并希望将每一列一个一个地追加到array1
上。但是,例如,我这样做:
array1 = np.append(array1, some_data[:, 0])
array1 = np.append(array1, some_data[:, 1])
我注意到我不会得到一个(100, 2)
矩阵,而是一个(200,)
数组。因此,我尝试将axis
指定为
array1 = np.append(array1, some_data[:, 0], axis=1)
产生AxisError: axis 1 is out of bounds for array of dimension 1.
接下来,我尝试使用np.c_[]
方法:
array1 = np.c_[array1, somedata[:, 0]]
这给了我ValueError: all the input array dimensions except for the concatenation axis must match exactly.
有什么办法可以将列顺序添加到NumPy数组中?
谢谢。
编辑
我了解到我最初的问题所包含的信息不足,无法为他人提供帮助,因此进行了更新以弥补最初的错误。
我的主要目标是制作一个以“贪婪的方式”选择特征的程序。基本上,我尝试使用设计矩阵some_data
,这是一个包含浮点数的(100, 100)
矩阵,并使用越来越多的特征拟合线性回归模型,直到找到最好的功能集。
例如,由于我总共有100个特征,因此第一轮将在每个100个模型上拟合模型,选择最佳模型并进行存储,然后继续其余99个。
这就是我想做的事情,但是从一开始我就遇到了我提到的问题。
答案 0 :(得分:3)
您从一个(0,)数组和一个形状为(n,)的形状开始:
In [482]: arr1 = np.array([])
In [483]: arr1.shape
Out[483]: (0,)
In [484]: arr2 = np.array([1,2,3])
In [485]: arr2.shape
Out[485]: (3,)
np.append
使用concatenate
(但在未提供轴的情况下有些有趣的事情):
In [486]: np.append(arr1, arr2)
Out[486]: array([1., 2., 3.])
In [487]: np.append(arr1, arr2,axis=0)
Out[487]: array([1., 2., 3.])
In [489]: np.concatenate([arr1, arr2])
Out[489]: array([1., 2., 3.])
并且尝试轴= 1
In [488]: np.append(arr1, arr2,axis=1)
---------------------------------------------------------------------------
AxisError Traceback (most recent call last)
<ipython-input-488-457b8657453e> in <module>()
----> 1 np.append(arr1, arr2,axis=1)
/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py in append(arr, values, axis)
4526 values = ravel(values)
4527 axis = arr.ndim-1
-> 4528 return concatenate((arr, values), axis=axis)
AxisError: axis 1 is out of bounds for array of dimension 1
查看整个消息-错误在concatenate
步骤中发生。您无法沿axis=1
连接一维数组。
反复使用np.append
或什至np.concatenate
很慢(每次都会创建一个新数组),并且很难正确初始化。不能广泛使用append-to-empty-list
列表食谱。
np.c_
仅仅是concatenate
的封面功能。
不仅有一个empty
数组。 np.array([[]])
和np.array([[[]]])
也有0个元素。
如果要将列添加到数组,则需要以2d数组开始,并且列也必须为2d。
下面是2个2d数组正确连接的示例:
In [490]: np.concatenate([ np.zeros((3,0),int), np.arange(3)[:,None]], axis=1)
Out[490]:
array([[0],
[1],
[2]])
column_stack
是concatenate
的另一个掩盖功能,可确保输入为2d。但是即使有了初始的“空”数组也很棘手。
In [492]: np.column_stack([np.zeros(3,int), np.arange(3)])
Out[492]:
array([[0, 0],
[0, 1],
[0, 2]])
In [493]: np.column_stack([np.zeros((3,0),int), np.arange(3)])
Out[493]:
array([[0],
[1],
[2]])
np.c_
与column_stack
很像,尽管以不同的方式实现:
In [496]: np.c_[np.zeros(3,int), np.arange(3)]
Out[496]:
array([[0, 0],
[0, 1],
[0, 2]])
基本信息是,使用np.concatenate
时需要注意尺寸。它的变体允许您稍微弄乱事情,但是您确实需要了解这种弄乱才能使事情正确,尤其是从这种定义不明确的“空”数组开始时。
答案 1 :(得分:1)
我通常使用连接方法,并像这样:
# Some stuff
alldata = None
....
array1 = np.random.random((100,1))
if alldata is None: alldata = array1
...
array2 = np.random.random((100,1))
alldata = np.concatenate((alldata,array2),axis=1)
以防万一,您正在使用向量:
alldata = None
....
array1 = np.random.random((100,))
if alldata is None: alldata = array1[:,np.newaxis]
...
array2 = np.random.random((100,))
alldata = np.concatenate((alldata,array2[:,np.newaxis]),axis=1)