如何向numpy数组添加列

58 人关注

我试图向由 recfromcsv 创建的数组添加一列。在这种情况下,它是一个数组。 [210,8] (行,列)。

我想增加一个第九列。空的或有零的都无所谓。

from numpy import genfromtxt
from numpy import recfromcsv
import numpy as np
import time
if __name__ == '__main__':
 print("testing")
 my_data = recfromcsv('LIAB.ST.csv', delimiter='\t')
 array_size = my_data.size
 #my_data = np.append(my_data[:array_size],my_data[9:],0)
 new_col = np.sum(x,1).reshape((x.shape[0],1))
 np.append(x,new_col,1)
    
2 个评论
那什么是不成功的呢?
不起作用的地方是,无论我尝试什么版本,它都不能给我正确的尺寸。
python
numpy
user2130951
user2130951
发布于 2013-04-04
7 个回答
askewchan
askewchan
发布于 2022-04-02
已采纳
0 人赞同

我认为你的问题是,你希望 np.append 能够就地添加列,但是由于numpy数据的存储方式,它所做的是创建一个连接数组的副本

Returns
-------
append : ndarray
    A copy of `arr` with `values` appended to `axis`.  Note that `append`
    does not occur in-place: a new array is allocated and filled.  If
    `axis` is None, `out` is a flattened array.

所以你需要保存输出all_data = np.append(...)

my_data = np.random.random((210,8)) #recfromcsv('LIAB.ST.csv', delimiter='\t')
new_col = my_data.sum(1)[...,None] # None keeps (n, 1) shape
new_col.shape
#(210,1)
all_data = np.append(my_data, new_col, 1)
all_data.shape
#(210,9)

替代方式。

all_data = np.hstack((my_data, new_col))
all_data = np.concatenate((my_data, new_col), 1)

我相信这三个函数(以及np.vstack)之间的唯一区别是它们在axis未被指定时的默认行为。

  • concatenate assumes axis = 0
  • hstack assumes axis = 1 unless inputs are 1d, then axis = 0
  • vstack assumes axis = 0 after adding an axis if inputs are 1d
  • append flattens array
  • 根据你的评论,并更仔细地查看你的示例代码,我现在相信,你可能想做的是添加一个field到一个记录数组. 你同时导入了genfromtxt,返回一个结构化阵列recfromcsv,其返回的是微妙不同的记录数组 (recarray). 你使用了recfromcsv,所以现在my_data实际上是一个recarray,这意味着很可能是my_data.shape = (210,),因为recarrays是1d记录数组,其中每个记录是一个具有给定dtype的元组。

    So you could try this:

    import numpy as np
    from numpy.lib.recfunctions import append_fields
    x = np.random.random(10)
    y = np.random.random(10)
    z = np.random.random(10)
    data = np.array( list(zip(x,y,z)), dtype=[('x',float),('y',float),('z',float)])
    data = np.recarray(data.shape, data.dtype, buf=data)
    data.shape
    #(10,)
    tot = data['x'] + data['y'] + data['z'] # sum(axis=1) won't work on recarray
    tot.shape
    #(10,)
    all_data = append_fields(data, 'total', tot, usemask=False)
    all_data
    #array([(0.4374783740738456 , 0.04307289878861764, 0.021176067323686598, 0.5017273401861498),
    #       (0.07622262416466963, 0.3962146058689695 , 0.27912715826653534 , 0.7515643883001745),
    #       (0.30878532523061153, 0.8553768789387086 , 0.9577415585116588  , 2.121903762680979 ),
    #       (0.5288343561208022 , 0.17048864443625933, 0.07915689716226904 , 0.7784798977193306),
    #       (0.8804269791375121 , 0.45517504750917714, 0.1601389248542675  , 1.4957409515009568),
    #       (0.9556552723429782 , 0.8884504475901043 , 0.6412854758843308  , 2.4853911958174133),
    #       (0.0227638618687922 , 0.9295332854783015 , 0.3234597575660103  , 1.275756904913104 ),
    #       (0.684075052174589  , 0.6654774682866273 , 0.5246593820025259  , 1.8742119024637423),
    #       (0.9841793718333871 , 0.5813955915551511 , 0.39577520705133684 , 1.961350170439875 ),
    #       (0.9889343795296571 , 0.22830104497714432, 0.20011292764078448 , 1.4173483521475858)], 
    #      dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8'), ('total', '<f8')])
    all_data.shape
    #(10,)
    all_data.dtype.names
    #('x', 'y', 'z', 'total')
        
    Getting File "d:\python27\lib\site-packages\numpy/core_methods.py", line 18, in _sum out=out, keepdims=keepdims) TypeError: cannot perform reduce with flexible type
    @用户2130951 你的阵列的 dtype 是什么?【替换代码1
    @user2130951 你确定你不想要添加一个 field ?
    atomh33ls
    atomh33ls
    发布于 2022-04-02
    0 人赞同

    如果你有一个数组, a ,比如210行8列。

    a = numpy.empty([210,8])
    

    并想增加第九列零,你可以这样做。

    b = numpy.append(a,numpy.zeros([len(a),1]),1)
        
    这将产生返回concatenate((arr, values), axis=axis) ValueError: 所有的输入数组必须有相同的维数。
    hmmmm. Just double checked. It works for me (using IDLE - python version 2.7)
    也许是因为,正如@askewchan所建议的,你实际上有一个重生者?我想如果你用 numpy.genfromtxt numpy.loadtxt 导入,这就可以了?
    如果列的形状是(X, ),那么你必须要.reshape(X, 1)来应用append。这就是用data[:,1]提取列后的情况
    这在我使用python 3.5的情况下是可行的,但是,是的,使用它必须要注意形状。
    RyanAbnavi
    RyanAbnavi
    发布于 2022-04-02
    0 人赞同

    最简单的解决方案是使用 numpy.insert() .

    替换代码0】比 np.append 的优势在于,你可以将新的列插入到自定义索引中。

    import numpy as np
    X = np.arange(20).reshape(10,2)
    X = np.insert(X, [0,2], np.random.rand(X.shape[0]*2).reshape(-1,2)*10, axis=1)
        
    在最后的重塑部分,发生了什么?
    qwr
    qwr
    发布于 2022-04-02
    0 人赞同

    np.append or np.hstack 我们可以使用 np.zeros 来创建这个零列(或 np.ones 来创建一个一列),并将其附加到我们的原始矩阵(二维数组)。

    def append_zeros(x):
        zeros = np.zeros((len(x), 1))  # zeros column as 2D array
        return np.hstack((x, zeros))   # append column
        
    Tomas
    Tomas
    发布于 2022-04-02
    0 人赞同

    我以这种方式在一个矩阵数组中添加一个新的带1的列。

    Z = append([[1 for _ in range(0,len(Z))]], Z.T,0).T
    

    也许它不是那么有效?

    不要使用该列表的理解力,使用 np.ones or np.ones_like : append([np.ones_like(Z)], Z.T, 0).T
    aderchox
    aderchox
    发布于 2022-04-02
    0 人赞同

    它可以这样做。

    import numpy as np
    # create a random matrix:
    A = np.random.normal(size=(5,2))
    # add a column of zeros to it:
    print(np.hstack((A,np.zeros((A.shape[0],1)))))
    

    一般来说,如果A是一个m*n的矩阵,而你需要增加一列,你必须创建一个n*1的零矩阵,然后用 "hstack "将零矩阵加到矩阵A的右边。

    cdahms
    cdahms
    发布于 2022-04-02
    0 人赞同

    与其他一些建议使用 numpy.hstack 的答案类似,但更容易阅读。

    import numpy as np
    # declare 10 rows x 3 cols integer array of all 1s
    arr = np.ones((10, 3), dtype=np.int64)
    # get the number of rows in the original array (as if we didn't know it was 10 or it could be different in other cases)
    numRows = arr.shape[0]
    # declare the new array which will be the new column, integer array of all 0s so it's visually distinct from the original array
    additionalColumn = np.zeros((numRows, 1), dtype=np.int64)
    # use hstack to tack on the additionl column
    result = np.hstack((arr, additionalColumn))
    print(result)
    

    result:

    $ python3 scratchpad.py 
    [[1 1 1 0]
     [1 1 1 0]
     [1 1 1 0]
     [1 1 1 0]
     [1 1 1 0]
     [1 1 1 0]