我认为你的问题在于你期望
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))
new_col = my_data.sum(1)[...,None]
new_col.shape
all_data = np.append(my_data, new_col, 1)
all_data.shape
其他方式:
all_data = np.hstack((my_data, new_col))
all_data = np.concatenate((my_data, new_col), 1)
我相信这三个函数(以及 np.vstack
)之间唯一的区别在于当 axis
未指定时它们的默认行为:
concatenate
假设 axis = 0
hstack
假设 axis = 1
,除非输入是1d,则假设 axis = 0
vstack
在添加轴后假设 axis = 0
如果输入是1d
append
将数组展平
根据您的评论,并仔细查看您的示例代码,我现在认为您可能想要做的是向
记录数组添加一个
字段。您导入了
genfromtxt
,它返回一个
结构化数组和
recfromcsv
,它返回略有不同的
记录数组(recarray
)。您使用了
recfromcsv
,因此当前
my_data
实际上是一个
recarray
,这意味着最可能
my_data.shape = (210,)
,因为recarrays是记录的一维数组,每个记录都是具有给定数据类型的元组。
所以你可以尝试这个:
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
tot = data['x'] + data['y'] + data['z']
tot.shape
all_data = append_fields(data, 'total', tot, usemask=False)
all_data
all_data.shape
all_data.dtype.names