Python 向Numpy数组添加新列的最佳方法
我想给矩阵加一个向量 向量当前是一个列表(尽管很容易转换为1D Numpy数组) 矩阵目前是一个Numpy数组 我在想,我可以将矩阵重塑为矩阵,然后循环最后一列,添加所需的值。但是,我不确定如何以这种方式重塑矩阵(即添加列)。我还希望我不必使用for循环Python 向Numpy数组添加新列的最佳方法,python,arrays,list,python-2.7,numpy,Python,Arrays,List,Python 2.7,Numpy,我想给矩阵加一个向量 向量当前是一个列表(尽管很容易转换为1D Numpy数组) 矩阵目前是一个Numpy数组 我在想,我可以将矩阵重塑为矩阵,然后循环最后一列,添加所需的值。但是,我不确定如何以这种方式重塑矩阵(即添加列)。我还希望我不必使用for循环 我研究了如何使用np.concatenate,np.hstack,以及np.append。但是,我认为我需要创建一个原始矩阵,作为列allNone的矩阵。这对我不起作用,因为在我需要将最后一个向量添加到矩阵之前,我使用这个矩阵进行许多计算 如果
我研究了如何使用
np.concatenate
,np.hstack
,以及np.append
。但是,我认为我需要创建一个原始矩阵,作为列allNone
的矩阵。这对我不起作用,因为在我需要将最后一个向量添加到矩阵之前,我使用这个矩阵进行许多计算 如果两者都是形状正确的numpy阵列,它将自动工作,这要归功于广播:
>>> m, n = 5, 6
>>> import numpy as np
>>> a = np.random.rand(5)
>>> b = np.random.rand(5, 6)
>>> a + b
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (5,) (5,6)
>>> a = a.reshape((5, 1))
>>> a + b
array([[ 0.79046654, 0.81610381, 1.6719495 , 1.46325624, 0.92063256,
1.06377227],
[ 1.6789712 , 1.39644844, 0.94905931, 0.95343555, 1.02492318,
1.15156054],
[ 1.37071564, 0.96554418, 1.75242678, 1.33323359, 1.00644693,
1.08850993],
[ 1.03423776, 1.03496123, 0.82535266, 0.12488793, 0.45481279,
0.90367567],
[ 0.51112569, 0.49737014, 1.01857201, 0.64392256, 0.23526375,
1.12763083]])
>>>
>m,n=5,6
>>>将numpy作为np导入
>>>a=np.rand.rand(5)
>>>b=np.rand.rand(5,6)
>>>a+b
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:操作数无法与形状(5,)(5,6)一起广播
>>>a=a.重塑(5,1))
>>>a+b
阵列([[0.79046654,0.81610381,1.6719495,1.46325624,0.92063256,
1.06377227],
[ 1.6789712 , 1.39644844, 0.94905931, 0.95343555, 1.02492318,
1.15156054],
[ 1.37071564, 0.96554418, 1.75242678, 1.33323359, 1.00644693,
1.08850993],
[ 1.03423776, 1.03496123, 0.82535266, 0.12488793, 0.45481279,
0.90367567],
[ 0.51112569, 0.49737014, 1.01857201, 0.64392256, 0.23526375,
1.12763083]])
>>>
看
>>> m, n = 5, 6
>>> import numpy as np
>>> a = np.random.rand(5)
>>> b = np.random.rand(5, 6)
>>> a + b
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (5,) (5,6)
>>> a = a.reshape((5, 1))
>>> a + b
array([[ 0.79046654, 0.81610381, 1.6719495 , 1.46325624, 0.92063256,
1.06377227],
[ 1.6789712 , 1.39644844, 0.94905931, 0.95343555, 1.02492318,
1.15156054],
[ 1.37071564, 0.96554418, 1.75242678, 1.33323359, 1.00644693,
1.08850993],
[ 1.03423776, 1.03496123, 0.82535266, 0.12488793, 0.45481279,
0.90367567],
[ 0.51112569, 0.49737014, 1.01857201, 0.64392256, 0.23526375,
1.12763083]])
>>>
>m,n=5,6
>>>将numpy作为np导入
>>>a=np.rand.rand(5)
>>>b=np.rand.rand(5,6)
>>>a+b
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:操作数无法与形状(5,)(5,6)一起广播
>>>a=a.重塑(5,1))
>>>a+b
阵列([[0.79046654,0.81610381,1.6719495,1.46325624,0.92063256,
1.06377227],
[ 1.6789712 , 1.39644844, 0.94905931, 0.95343555, 1.02492318,
1.15156054],
[ 1.37071564, 0.96554418, 1.75242678, 1.33323359, 1.00644693,
1.08850993],
[ 1.03423776, 1.03496123, 0.82535266, 0.12488793, 0.45481279,
0.90367567],
[ 0.51112569, 0.49737014, 1.01857201, 0.64392256, 0.23526375,
1.12763083]])
>>>
看
但是,请注意,最好首先分配所需的大小合适(最大)的数组,因为像
np.column\u stack
或np.append
这样的操作可能需要为较大的数组分配新空间,并将arr
中的所有值复制到新数组中。这可能很慢,而且内存效率也很低。(当您只需要一个阵列时,为什么要为两个几乎相同的阵列分配空间?)
因此,您可以使用
arr = np.empty((3, 5)) # the size of the final, biggest array
smallarr = arr[:, :-1]
由于arr[:,:-1]
是arr
的基本部分,smallarr
是arr的视图。修改smallarr
也会影响arr
例如:
In [117]: arr = np.empty((3, 5))
In [118]: smallarr = arr[:, :-1]
In [119]: smallarr[...] = np.arange(12).reshape(3,4)
In [123]: arr[:, -1] = v
In [124]: arr
Out[124]:
array([[ 0., 1., 2., 3., 1.],
[ 4., 5., 6., 7., 2.],
[ 8., 9., 10., 11., 3.]])
当分配给smallarr
时,只需确保使用smallarr[…]=…
而不是smallarr=…
,因为您希望就地修改smallarr
,而不是将变量名重定向到新对象
您还可以使用许多NumPy函数中可用的out
参数修改smallarr
。除了返回值外,函数还将值写入out
参数指定的数组
因此,您可以在smallarr
上进行计算,并对arr
进行修改,使其大小合适,所有计算都以节省内存的方式完成。您可以使用:
但是,请注意,最好首先分配所需的大小合适(最大)的数组,因为像
np.column\u stack
或np.append
这样的操作可能需要为较大的数组分配新空间,并将arr
中的所有值复制到新数组中。这可能很慢,而且内存效率也很低。(当您只需要一个阵列时,为什么要为两个几乎相同的阵列分配空间?)
因此,您可以使用
arr = np.empty((3, 5)) # the size of the final, biggest array
smallarr = arr[:, :-1]
由于arr[:,:-1]
是arr
的基本部分,smallarr
是arr的视图。修改smallarr
也会影响arr
例如:
In [117]: arr = np.empty((3, 5))
In [118]: smallarr = arr[:, :-1]
In [119]: smallarr[...] = np.arange(12).reshape(3,4)
In [123]: arr[:, -1] = v
In [124]: arr
Out[124]:
array([[ 0., 1., 2., 3., 1.],
[ 4., 5., 6., 7., 2.],
[ 8., 9., 10., 11., 3.]])
当分配给smallarr
时,只需确保使用smallarr[…]=…
而不是smallarr=…
,因为您希望就地修改smallarr
,而不是将变量名重定向到新对象
您还可以使用许多NumPy函数中可用的out
参数修改smallarr
。除了返回值外,函数还将值写入out
参数指定的数组
因此,您可以在
smallarr
上进行计算,并对arr
进行修改,使其大小合适,所有操作都以节省内存的方式完成。如何让Latex代码在这里工作?有。请参见@FredrikPihl-我刚刚使用URL解释Latex,但只有一个URL实际工作。。我检查了所有这些,它们都给出了我想在这个问题中展示的正确公式。有什么帮助吗?我如何让Latex代码在这里工作?有。请参见@FredrikPihl-我刚刚使用URL解释Latex,但只有一个URL实际工作。。我检查了所有这些,它们都给出了我想在这个问题中展示的正确公式。有什么帮助吗?这个答案是错误的。这段代码在做什么