python-增加数组大小并将新元素初始化为零

python-增加数组大小并将新元素初始化为零,python,arrays,Python,Arrays,我有一个大小为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从2x2转换为3x4。我在想,python中有类似的方法吗?在python中,如果输入是一个numpy数组,可以使用它来填充零- import numpy a

我有一个大小为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
从2x2转换为3x4。我在想,python中有类似的方法吗?

在python中,如果输入是一个numpy数组,可以使用它来填充零-

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
>> 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
如果您不想计算要填充多少个零,可以让代码在给定输出数组大小的情况下为您计算-

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中,可以使用-

样本运行-

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
>> 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

纯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))))
然后一个新的
就是
[[1,2,0,0],[2,3,0,0],[0,0,0]]

好消息:

  • [x]*n
    将重复
    x
    n
    -次
  • 可以使用
    +
    运算符连接列表
说明:

  • map(函数,列表)
    将迭代列表中的每个项,并将其传递给函数,并用返回值替换该项
  • A+([[0]*列]*(行-列(A))
    A
    正在使用剩余的“归零”列表进行扩展
    • 通过
      计数重复
      [0]
      中的项目
    • 按剩余行数重复该数组
  • ([0]*(列-len(x)))
    :对于每一行项目(
    x
    ),使用

问:有没有一种矢量化的方法

是的,有

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.]])
Q:在幕后以智能方式“扩展”A的数据结构是否具有资源效率?

不,幸运的是不多。尝试更大、更大或更大的尺寸,感受资源分配/处理成本…

Numpy具有真正的“幕后”数据结构,允许许多类似的跨步(重新)映射、基于视图的操作、快速矢量化/广播操作,但是,更改内存布局“跨跨步智能映射”相当昂贵。

因此,自1.7.0版以来,numpy添加了一个内置布局/映射器修改器
.lib.pad()
,该修改器具有良好的感知和优化能力,可以智能快速地处理“幕后”结构

B = np.lib.pad( A, 
                ( ( 0, 3 ), ( 0, 2) ),
                'constant',
                 constant_values = ( 0,  0 )
              )                                    # .pad() at a cost of ~ 270 us

您可以用numpy来做这类事情,但不能用纯python。如果你熟悉Matlab并想使用Python,你一定要看看numpy。@tom10,相反,请看刘帅的答案。@try catch finally:OP说1“我不想遍历每一行…”;2)“有没有一种方法可以矢量化…”。你提到的答案并没有涉及问题的这两个要点。例如,在他们的回答中,他们说“[map]将迭代每个项目”,感谢您的回答和解释@yashgarg1232很高兴为您提供帮助!谢谢你的回答。:)@yashgarg1232很高兴为您提供帮助:)谢谢您的回答:)