【问题标题】:Dimensions of Numpy Array changes when adding element to first array of first array in 3D array将元素添加到 3D 数组中第一个数组的第一个数组时,Numpy 数组的尺寸会发生变化
【发布时间】:2021-01-26 14:09:45
【问题描述】:

我是 Numpy 的新手,我发现在 3D 数组的第一个数组的第一个数组中添加一个元素会改变数组的维度。为什么会这样?请帮忙!

该数组为 ndim 提供 3 的输出

c = np.array([[[1, 2, 3],
               [4, 5, 6]],
              [[7, 8, 9],
               [10, 11, 12]]])
print(c.ndim)
>> 3

但是这个数组为 ndim 提供了 2 的输出

c = np.array([[[1, 2, 3, 4, 5],
               [4, 5, 6]],
              [[7, 8, 9],
               [10, 11, 12]]])
>> 2

为什么会这样?

【问题讨论】:

  • 检查 shapedtype 以及 ndim。对于像这样的小例子,显示数组本身。第二种情况是object dtype,对于初学者来说是错误的。较新的 numpy 版本会发出警告。

标签: python arrays python-3.x numpy


【解决方案1】:

对于第一个数组,形状是 (3, 3, 3),元素是数字。对于第二个数组,形状是 (2, 2),元素是 python 列表。 (对于第二个数组,如果我们将数字视为元素,我们无法写出它的形状,因为列表长度不一致)

【讨论】:

  • 谢谢兄弟,请问第二个数组元素是如何变成python列表的?
  • @Abdul 数组需要其固定、恒定的形状。对于一个 (3, 3, 3) 数组A,我们可以认为它的形状意味着row - column - depth。无论选择什么rowcolumnA[row, column] 总是3 个数字。 Numpy 足够聪明,可以在不违反规则的情况下找到“最佳元素”。如果 A[0, 0] 从 3 个数字更改为 5 个数字,则 A 将被视为包含不同长度列表的数组。
  • 谢谢兄弟,这真的很有帮助。你能分享我可以掌握这些技能的材料吗?
  • 如果您想成为大师,numpy documentation 肯定会 100% 有帮助(我从未完成它,因为它很无聊)。由于 Numpy 是用 C 编写的,因此理解 C/C++ 数组/向量也有很大帮助。猜测有时也有帮助。祝你好运!
【解决方案2】:

作为已接受答案的补充,请查看生成的数组:

In [39]: c
Out[39]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
In [40]: c.shape
Out[40]: (2, 2, 3)

numpy basics 中记录了这种多维数值数组的创建。这就是 numpy 旨在创建和使用的内容。

当您将元素添加到第一个内部列表时(此np.array 函数的输入是列表列表):

In [41]: c = np.array([[[1, 2, 3,4,5],
    ...:                [4, 5, 6]],
    ...:               [[7, 8, 9],
    ...:                [10, 11, 12]]])
<ipython-input-41-c00712d1df0d>:1: VisibleDeprecationWarning: Creating an 
 ndarray from ragged nested sequences (which is a list-or-tuple of lists-or- 
 tuples-or ndarrays with different lengths or shapes) is deprecated. If you 
 meant to do this, you must specify 'dtype=object' when creating the ndarray
  c = np.array([[[1, 2, 3,4,5],

此警告已在最近的numpy 版本中添加,因为太多人错误地这样做了。如果您想要一个数值数组,请不要提供参差不齐的输入。此对象 dtype 数组是在回退模式下创建的,因为它无法像在第一种情况下那样创建数值数组。

In [42]: c
Out[42]: 
array([[list([1, 2, 3, 4, 5]), list([4, 5, 6])],
       [list([7, 8, 9]), list([10, 11, 12])]], dtype=object)
In [43]: c.shape
Out[43]: (2, 2)

这创建了一个包含 python 对象的 (2,2) 数组,在本例中是列表 - 与输入中的内部列表相同。

Python 列表包含对对象的引用。对象 dtype 数组也是如此。性能方面类似于列表。

对象 dtype 数组的创建和使用没有很好的文档记录。例如,这个介绍页面根本没有提及它们

https://numpy.org/doc/stable/user/absolute_beginners.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多