Python 如何更改numpy数组的值

Python 如何更改numpy数组的值,python,arrays,numpy,Python,Arrays,Numpy,我有一个形状为(826,2)的numpy数组“X”。我有另一个由“X_扩展”形状的零组成的numpy数组(X.shape[0],6)。我想用数组X的feature0,feature1,feature0^2,feature1^2,feature1*feature2,1替换展开的X_的元素 比如说 X = np.array([ [0,0], [1,0], [2.61,-1.28], [-0.59,2.1] ]) 我想把X_扩展成 ([[ 0. , 0.

我有一个形状为(826,2)的numpy数组“X”。我有另一个由“X_扩展”形状的零组成的numpy数组(X.shape[0],6)。我想用数组X的feature0,feature1,feature0^2,feature1^2,feature1*feature2,1替换展开的X_的元素

比如说

X = np.array([
    [0,0],
    [1,0],
    [2.61,-1.28],
    [-0.59,2.1]
])
我想把X_扩展成

([[ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  1.],
  [ 1.    ,  0.    ,  1.    ,  0.    ,  0.    ,  1.],
  [ 2.61  , -1.28  ,  6.8121,  1.6384, -3.3408,  1.],
  [-0.59  ,  2.1   ,  0.3481,  4.41  , -1.239 ,  1.]])

可以从头开始构造数组,也可以创建空数组并用切片填充值

import numpy as np
X = np.array([[0,0],[1,0],[2.61,-1.28],[-0.59,2.1]])
Xe = np.block([X,X**2,np.prod(X,axis=1,keepdims=1),np.ones([X.shape[0],1])])
还可以根据需要使用水平堆叠列

X_extended = np.hstack((X, X**2, np.prod(X,axis=1,keepdims=1), np.ones([X.shape[0],1])))
print(X_extended)

[[ 0.      0.      0.      0.      0.      1.    ]
 [ 1.      0.      1.      0.      0.      1.    ]
 [ 2.61   -1.28    6.8121  1.6384 -3.3408  1.    ]
 [-0.59    2.1     0.3481  4.41   -1.239   1.    ]]

计时:

X = np.random.random((100000,2))

# np.hstack() @akilat90
%timeit np.hstack((X, X**2, np.prod(X,axis=1,keepdims=1), np.ones([X.shape[0],1])))    
100 loops, best of 3: 4.92 ms per loop

# np.block() @percusse
%timeit np.block([X,X**2,np.prod(X,axis=1,keepdims=1),np.ones([X.shape[0],1])])
100 loops, best of 3: 5.01 ms per loop

# @Bert's Answer
def bert(X):
   X_e = np.zeros((X.shape[0], 6)) 

   X_e[:,:2] = X 
   X_e[:,2] = X[:,0] * X[:,0]
   X_e[:,3] = X[:,1] * X[:,1]
   X_e[:,4] = X[:,0] * X[:,1]
   X_e[:,5] = 1 

   return X_e

%timeit bert(X)
100 loops, best of 3: 3.63 ms per loop

# list comprehension @Joe Iddon
%timeit np.array([[i, j, i**2, j**2, i*j] for i,j in X])
1 loop, best of 3: 246 ms per loop

虽然有点冗长,但@Bert的答案似乎是最快的,而
np.hstack()
np.block()
几乎是一样的,列表理解是最慢的。

我会用
列表理解来做这件事,它在我看来非常可读:

np.array([[i, j, i**2, j**2, i*j] for i,j in X])
其中:

array([[ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
       [ 1.    ,  0.    ,  1.    ,  0.    ,  0.    ],
       [ 2.61  , -1.28  ,  6.8121,  1.6384, -3.3408],
       [-0.59  ,  2.1   ,  0.3481,  4.41  , -1.239 ]])

做这件事的最佳方法是什么?
那么,你有一些方法吗?
X_e[:,2:4]=X**2
此答案因其长度和内容而被标记为低质量。考虑提供一个解释和你的答案。<代码> NP.CouthNeNATE(…,轴= -1)< /C> >将在这里更快。
array([[ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
       [ 1.    ,  0.    ,  1.    ,  0.    ,  0.    ],
       [ 2.61  , -1.28  ,  6.8121,  1.6384, -3.3408],
       [-0.59  ,  2.1   ,  0.3481,  4.41  , -1.239 ]])