numpy 3D矩阵中的Paddin新轴返回错误

jvlzgdj9  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(147)

我需要做的是将2D矩阵扩展到3D,并在第三个轴上填充任意数量的零。返回的错误为:
所有输入数组必须具有相同的维数,但索引0处的数组具有3维,而索引1处的数组具有0维
我应该改正什么?

import numpy as np

kernel = np.ones((3,3)) / 9
kernel = kernel[..., None]
print(type(kernel))

print(np.shape(kernel))
print(kernel)

i = 1
for i in range(27):
    np.append(kernel, 0, axis = 2)

print(kernel)
vmjh9lq9

vmjh9lq91#

  • 我应该使用什么来代替np.append()?*

使用concatenate()

import numpy as np

kernel = np.ones((3,3)) / 9
kernel = kernel[..., None]
print(type(kernel))

print(np.shape(kernel))
print(kernel)
print('-----------------------------')

append_values = np.zeros((3,3))
append_values = append_values[..., None]
i = 1
for i in range(2):
    kernel = np.concatenate((kernel, append_values), axis=2)

print(kernel.shape)
print(kernel)

但最好在第三维中生成已具有所需形状的append_values数组,以避免循环:

append_values = np.zeros((3,3,2)) # or (3,3,27)
kernel = np.concatenate((kernel, append_values), axis=2)
print(kernel.shape)
print(kernel)
oug3syen

oug3syen2#

看看输出和错误--完整的错误,而不仅仅是一件!

<class 'numpy.ndarray'>
(3, 3, 1)
...

In [94]: np.append(kernel, 0, axis = 2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [94], in <cell line: 1>()
----> 1 np.append(kernel, 0, axis = 2)

File <__array_function__ internals>:5, in append(*args,**kwargs)

File ~\anaconda3\lib\site-packages\numpy\lib\function_base.py:4817, in append(arr, values, axis)
   4815     values = ravel(values)
   4816     axis = arr.ndim-1
-> 4817 return concatenate((arr, values), axis=axis)

File <__array_function__ internals>:5, in concatenate(*args,**kwargs)

ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 3 dimension(s) and the array at index 1 has 0 dimension(s)

shape所示,kernel是3D(3,3,1)。np.append获取标量0,生成数组np.array(0),并调用concatenate。如果你花时间阅读它的文档,concatenate需要匹配的维度数量。
但我对您的代码的主要不满是您使用了np.append而没有捕获结果。同样,如果您花时间阅读文档,您会意识到np.append不能就地工作。它不修改kernel。当它工作时,它返回一个新的数组。而在一个循环中重复这样做是低效的。
看起来您采用了List Append模型,不假思索地将其应用于数组。这不是numpy的编码方式。
如另一个答案所示,如果您想要生成一个(3,3,28)数组,那么对(3,3,27)个0数组执行一次concatenate是可行的。
或者,制作一个0的(3,3,28)数组,并将1(3,3,1)数组复制到适当的列。

相关问题