将新列添加到空NumPy数组

时间:2018-11-01 13:33:28

标签: python arrays numpy

我正在尝试向空的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个。

这就是我想做的事情,但是从一开始我就遇到了我提到的问题。

2 个答案:

答案 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_stackconcatenate的另一个掩盖功能,可确保输入为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)