Python:调整现有数组的大小并填充零

hjw*_*ide 25 python arrays resize numpy matrix

我认为我的问题应该很简单,但我无法在互联网上找到任何帮助.我是Python的新手,所以我可能会遗漏一些非常明显的东西.

我有一个数组,S,就像这样[x x x] (one-dimensional).我现在创建一个对角矩阵,sigmanp.diag(S)-到目前为止,那么好.现在,我想调整这个新的对角线数组的大小,以便我可以将它乘以我拥有的另一个数组.

import numpy as np
...
shape = np.shape((6, 6)) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
my_sigma = sigma.resize(shape) #Resize the matrix and fill with zeros - returns "None" - why?
Run Code Online (Sandbox Code Playgroud)

但是,当我打印出内容时my_sigma,我明白了"None".有人可以指出我正确的方向,因为我无法想象这应该是如此复杂.

在此先感谢您的帮助!

卡斯帕

图形:

我有这个:

[x x x]
Run Code Online (Sandbox Code Playgroud)

我要这个:

[x 0 0]
[0 x 0]
[0 0 x]
[0 0 0]
[0 0 0]
[0 0 0] - or some similar size, but the diagonal elements are important.
Run Code Online (Sandbox Code Playgroud)

Hoo*_*ked 55

版本1.7.0 numpy.pad中有一个新的numpy函数可以在一行中执行此操作.与其他答案一样,您可以np.diag在填充之前构造对角矩阵.((0,N),(0,0))在这个答案中使用的元组表示要填充的矩阵的"边".

import numpy as np

A = np.array([1, 2, 3])

N = A.size
B = np.pad(np.diag(A), ((0,N),(0,0)), mode='constant')
Run Code Online (Sandbox Code Playgroud)

B 现在等于:

[[1 0 0]
 [0 2 0]
 [0 0 3]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
Run Code Online (Sandbox Code Playgroud)


voi*_*hos 20

sigma.resize()None因为它就地运作而返回.np.resize(sigma, shape)另一方面,返回结果但不是用零填充,而是填充数组的重复.

此外,该shape()函数返回输入的形状.如果您只想预定义形状,只需使用元组即可.

import numpy as np
...
shape = (6, 6) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
sigma.resize(shape) #Resize the matrix and fill with zeros
Run Code Online (Sandbox Code Playgroud)

但是,这将首先展平原始数组,然后将其重建为给定的形状,从而破坏原始排序.如果你只想用零"填充",而不是使用resize()你可以直接索引到生成的零矩阵.

# This assumes that you have a 2-dimensional array
zeros = np.zeros(shape, dtype=np.int32)
zeros[:sigma.shape[0], :sigma.shape[1]] = sigma
Run Code Online (Sandbox Code Playgroud)


Phi*_*per 5

我看到了编辑...您必须先创建零,然后将一些数字移入其中。np.diag_indices_from可能对你有用

bigger_sigma = np.zeros(shape, dtype=sigma.dtype)
diag_ij = np.diag_indices_from(sigma)
bigger_sigma[diag_ij] = sigma[diag_ij] 
Run Code Online (Sandbox Code Playgroud)