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

34 投票
5 回答
84145 浏览
提问于 2025-04-17 12:54

我觉得我的问题应该很简单,但在网上找不到任何帮助。我刚开始学Python,所以可能有些很明显的地方我没注意到。

我有一个数组,叫做S,长得像这样 [x x x] (一维)。然后我用 np.diag(S) 创建了一个对角矩阵 sigma,到这里一切都还好。接下来,我想调整这个新的对角数组的大小,以便能和我手头的另一个数组相乘。

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?

可是,当我打印 my_sigma 的内容时,结果却是 "None"。有人能帮我指点一下方向吗?我实在想不明白这怎么会这么复杂。

提前感谢任何帮助!

Casper

图示:

我现在有这个:

[x x x]

我想要这个:

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

5 个回答

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

在1.7.0版本的numpy中,有一个新功能叫做 numpy.pad,可以用一行代码来实现这个功能。和其他的回答一样,你可以先用 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')

B 现在等于:

[[1 0 0]
 [0 2 0]
 [0 0 3]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
25

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

不过,这样做会先把你原来的数组“压扁”,然后再按照给定的形状重建,这样会打乱原来的顺序。如果你只是想用零来“填充”,那么不如直接在生成的零矩阵中进行索引,而不是使用 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

撰写回答