我有一个2 x 2大小的数组,我想将大小更改为3 x 4.
A = [[1 2 ],[2 3]]
A_new = [[1 2 0 0],[2 3 0 0],[0 0 0 0]]
我尝试了3个形状,但它没有,并且追加只能追加行,而不是列。我不想遍历每一行来添加列。
有没有任何矢量化方法可以像在MATLAB中那样做:A(:,3:4) = 0;
和A(3,:) = 0;
这将A
从2 x 2转换为3 x 4.我在想在python中有类似的方法吗?
答案 0 :(得分:5)
在Python中,如果输入是一个numpy数组,你可以使用np.lib.pad
在它周围填充零 -
import numpy as np
A = np.array([[1, 2 ],[2, 3]]) # Input
A_new = np.lib.pad(A, ((0,1),(0,2)), 'constant', constant_values=(0)) # Output
示例运行 -
In [7]: A # Input: A numpy array
Out[7]:
array([[1, 2],
[2, 3]])
In [8]: np.lib.pad(A, ((0,1),(0,2)), 'constant', constant_values=(0))
Out[8]:
array([[1, 2, 0, 0],
[2, 3, 0, 0],
[0, 0, 0, 0]]) # Zero padded numpy array
如果你不想用数学来填充多少个零,你可以让代码在给定输出数组大小的情况下为你做这个 -
In [29]: A
Out[29]:
array([[1, 2],
[2, 3]])
In [30]: new_shape = (3,4)
In [31]: shape_diff = np.array(new_shape) - np.array(A.shape)
In [32]: np.lib.pad(A, ((0,shape_diff[0]),(0,shape_diff[1])),
'constant', constant_values=(0))
Out[32]:
array([[1, 2, 0, 0],
[2, 3, 0, 0],
[0, 0, 0, 0]])
或者,您可以从零初始化输出数组开始,然后从A
-
In [38]: A
Out[38]:
array([[1, 2],
[2, 3]])
In [39]: A_new = np.zeros(new_shape,dtype = A.dtype)
In [40]: A_new[0:A.shape[0],0:A.shape[1]] = A
In [41]: A_new
Out[41]:
array([[1, 2, 0, 0],
[2, 3, 0, 0],
[0, 0, 0, 0]])
在MATLAB中,您可以使用padarray
-
A_new = padarray(A,[1 2],'post')
示例运行 -
>> A
A =
1 2
2 3
>> A_new = padarray(A,[1 2],'post')
A_new =
1 2 0 0
2 3 0 0
0 0 0 0
答案 1 :(得分:3)
Pure Python方式实现了这个目标:
row = 3
column = 4
A = [[1, 2],[2, 3]]
A_new = map(lambda x: x + ([0] * (column - len(x))), A + ([[0] * column] * (row - len(A))))
然后A_new
为[[1, 2, 0, 0], [2, 3, 0, 0], [0, 0, 0, 0]]
。
很高兴知道:
[x] * n
将重复x
n
- 次+
运算符<强>解释强>
map(function, list)
将迭代列表中的每个项目将其传递给 function 并将该项目替换为返回值A + ([[0] * column] * (row - len(A)))
:A
正在使用剩余的“归零”列表进行扩展
[0]
点数column
中的项目
([0] * (column - len(x)))
:对于每个行项目(x
),使用答案 2 :(得分:2)
问:是否有向量化的方式......
答:是的,有
A = np.ones( (2,2) ) # numpy create/assign 1-s
B = np.zeros( (4,5) ) # numpy create/assign 0-s "padding" mat
B[:A.shape[0],:A.shape[1]] += A[:,:] # numpy vectorised .ADD at a cost of ~270 us
B[:A.shape[0],:A.shape[1]] = A[:,:] # numpy vectorised .STO at a cost of ~180 us
B[:A.shape[0],:A.shape[1]] = A # numpy high-level .STO at a cost of ~450 us
B
Out[4]:
array([[ 1., 1., 0., 0., 0.],
[ 1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
问:以“智能”的方式“延伸”A的数据结构是否“资源有效”?
答:不,幸运的是不多。尝试更大,更大或更大的尺寸来感受资源分配/处理成本......
Numpy拥有真正的数据结构“幕后”,允许大量smart tricks类步(重新)映射,基于视图的操作,快速矢量化/广播操作,但是,改变内存 - 布局“跨越跨越智能地图”相当昂贵。
由于这个原因,numpy从1.7.0开始就添加了一个内置的布局/映射器修改器 .lib.pad()
,它非常清楚&amp;优化,以处理智能和安全的“幕后”结构快。
B = np.lib.pad( A,
( ( 0, 3 ), ( 0, 2) ),
'constant',
constant_values = ( 0, 0 )
) # .pad() at a cost of ~ 270 us