Python Numpy的“shape”函数为2D数组返回1D值

Python Numpy的“shape”函数为2D数组返回1D值,python,arrays,python-3.x,numpy,multidimensional-array,Python,Arrays,Python 3.x,Numpy,Multidimensional Array,因此,我创建了这个数组作为示例: a = np.array([[1, 1, 1, 1, 2], [2, 2, 2, 3], [3, 3, 3, 4], [13, 49, 13, 49], [10, 10, 2, 2], [11, 1, 1, 1, 2], [22, 2, 2, 3], [33, 3, 3, 4], [133, 49, 13, 49], [100, 10, 2, 2], [5, 1, 1, 1, 2], [32, 2, 2, 3]

因此,我创建了这个数组作为示例:

a = np.array([[1, 1, 1, 1, 2], [2, 2, 2, 3], [3, 3, 3, 4], [13, 49, 13, 49], [10, 10, 2, 2],
             [11, 1, 1, 1, 2], [22, 2, 2, 3], [33, 3, 3, 4], [133, 49, 13, 49], [100, 10, 2, 2],
             [5, 1, 1, 1, 2], [32, 2, 2, 3], [322, 3, 3, 4], [13222, 49, 13, 49], [130, 10, 2, 2]])
我想创建一个二维数组。例如,在本例中,15*5数组

但是,当我使用a.shape时,它返回15


我的数组定义有什么问题?

看一看a.dtype:它是对象的O。这通常发生在您尝试输入不规则数组时。在本例中,您可以看到只有索引为0、5、10的元素实际上才有五个元素。所有其他子列表都有四个元素。如果你想要一个15,5的数组,你需要确保每一行有5个元素。

看看a.dtype:它是O代表对象。这通常发生在您尝试输入不规则数组时。在本例中,您可以看到只有索引为0、5、10的元素实际上才有五个元素。所有其他子列表都有四个元素。如果你想要一个15,5的数组,你需要确保每行有5个元素。

检查你的数组是什么:

import numpy as np

a = np.array([[1, 1, 1, 1, 2], [2, 2, 2, 3], [3, 3, 3, 4], [13, 49, 13, 49], [10, 10, 2, 2],
             [11, 1, 1, 1, 2], [22, 2, 2, 3], [33, 3, 3, 4], [133, 49, 13, 49], [100, 10, 2, 2],
             [5, 1, 1, 1, 2], [32, 2, 2, 3], [322, 3, 3, 4], [13222, 49, 13, 49], [130, 10, 2, 2]])

print(repr(a))
它是一个列表对象数组:

array([list([1, 1, 1, 1, 2]), list([2, 2, 2, 3]), list([3, 3, 3, 4]),
       list([13, 49, 13, 49]), list([10, 10, 2, 2]),
       list([11, 1, 1, 1, 2]), list([22, 2, 2, 3]), list([33, 3, 3, 4]),
       list([133, 49, 13, 49]), list([100, 10, 2, 2]),
       list([5, 1, 1, 1, 2]), list([32, 2, 2, 3]), list([322, 3, 3, 4]),
       list([13222, 49, 13, 49]), list([130, 10, 2, 2])], dtype=object)

问题是,每个子列表中的元素数量有所不同,其中一些为4,一些为5,因此只能将其存储为列表的1D数组。要获得2D数组,子列表中的元素数必须相等。

检查数组的实际情况:

import numpy as np

a = np.array([[1, 1, 1, 1, 2], [2, 2, 2, 3], [3, 3, 3, 4], [13, 49, 13, 49], [10, 10, 2, 2],
             [11, 1, 1, 1, 2], [22, 2, 2, 3], [33, 3, 3, 4], [133, 49, 13, 49], [100, 10, 2, 2],
             [5, 1, 1, 1, 2], [32, 2, 2, 3], [322, 3, 3, 4], [13222, 49, 13, 49], [130, 10, 2, 2]])

print(repr(a))
它是一个列表对象数组:

array([list([1, 1, 1, 1, 2]), list([2, 2, 2, 3]), list([3, 3, 3, 4]),
       list([13, 49, 13, 49]), list([10, 10, 2, 2]),
       list([11, 1, 1, 1, 2]), list([22, 2, 2, 3]), list([33, 3, 3, 4]),
       list([133, 49, 13, 49]), list([100, 10, 2, 2]),
       list([5, 1, 1, 1, 2]), list([32, 2, 2, 3]), list([322, 3, 3, 4]),
       list([13222, 49, 13, 49]), list([130, 10, 2, 2])], dtype=object)

问题是,每个子列表中的元素数量有所不同,其中一些为4,一些为5,因此只能将其存储为列表的1D数组。要获得2D数组,子列表中的元素数必须相等。

示例中的问题是某些行有5个元素,而其他行有4个元素。 因此,numpy无法创建它的15*5数组。 它在您的案例中抱怨:

不推荐从不规则嵌套序列创建数据数组,该序列是列表或元组的列表或元组,或具有不同长度或形状的数据数组

根据Terasa,对原始数据存在一些根本性的误读/误解。 所以你要做的第一件事就是找出问题所在

如果它是安全的,并且唯一的目标是生成一个矩阵,那么您可以尝试以下代码。 一种解决方案是使用pandas来处理缺少的值。 然后将数据帧转换为numpy矩阵

代码是

将numpy作为np导入 作为pd进口熊猫 df=pd.数据帧[[1,1,1,1,2],[2,2,2,3],[3,3,4],[13,49,13,49],[10,10,2,2], [11, 1, 1, 1, 2], [22, 2, 2, 3], [33, 3, 3, 4], [133, 49, 13, 49], [100, 10, 2, 2], [5, 1, 1, 1, 2], [32, 2, 2, 3], [322, 3, 3, 4], [13222, 49, 13, 49], [130, 10, 2, 2]] a=df.to_numpy
您可以直接运行代码以查看生成的矩阵。

示例中的问题是某些行有5个元素,而其他行有4个元素。 因此,numpy无法创建它的15*5数组。 它在您的案例中抱怨:

不推荐从不规则嵌套序列创建数据数组,该序列是列表或元组的列表或元组,或具有不同长度或形状的数据数组

根据Terasa,对原始数据存在一些根本性的误读/误解。 所以你要做的第一件事就是找出问题所在

如果它是安全的,并且唯一的目标是生成一个矩阵,那么您可以尝试以下代码。 一种解决方案是使用pandas来处理缺少的值。 然后将数据帧转换为numpy矩阵

代码是

将numpy作为np导入 作为pd进口熊猫 df=pd.数据帧[[1,1,1,1,2],[2,2,2,3],[3,3,4],[13,49,13,49],[10,10,2,2], [11, 1, 1, 1, 2], [22, 2, 2, 3], [33, 3, 3, 4], [133, 49, 13, 49], [100, 10, 2, 2], [5, 1, 1, 1, 2], [32, 2, 2, 3], [322, 3, 3, 4], [13222, 49, 13, 49], [130, 10, 2, 2]] a=df.to_numpy 您可以直接运行代码以查看生成的矩阵。

Tl;dr.您的单个列表长度可变,因此迫使您的NumPy数组成为列表对象的1D数组,而不是整数/浮点数的2D数组 仅当每个轴具有相同数量的元素时,才能定义Numpy数组。否则,将留下1D对象数组

这就是您的阵列所发生的情况。您有一个列表列表,其中包含数量可变的元素(大约4个和5个)。在转换过程中,会将其转换为15个numpy数组,其中数组有15个单独的列表对象

a = np.array([[1, 1, 1, 1, 2], [2, 2, 2, 3], [3, 3, 3, 4], [13, 49, 13, 49]
##           |______________|  |__________|
##                   |               |
##            5 length            4 length
快速演示- 您可能想做的是固定每个子列表中的元素数。 或者,您可能需要对数组进行一些填充。 Tl;dr.您的单个列表长度可变,因此迫使您的NumPy数组成为列表对象的1D数组,而不是整数/浮点数的2D数组 仅当每个轴具有相同数量的元素时,才能定义Numpy数组。否则,将留下1D对象数组

这就是您的阵列所发生的情况。您有一个列表列表,其中包含数量可变的元素(大约4个和5个)。这是在监狱里 版本将其转换为15个numpy数组,其中数组有15个单独的列表对象

a = np.array([[1, 1, 1, 1, 2], [2, 2, 2, 3], [3, 3, 3, 4], [13, 49, 13, 49]
##           |______________|  |__________|
##                   |               |
##            5 length            4 length
快速演示- 您可能想做的是固定每个子列表中的元素数。 或者,您可能需要对数组进行一些填充。
最后有人真的回答了这个问题。最后有人真的回答了这个问题。你怎么知道应该缺少哪些元素?我认为这远比帮助更危险,因为OP显然对原始数据有一些根本性的误读/曲解,而默默地向数据中添加NaN并不能解决任何问题,而是隐藏了问题。放松点。我只是提供一种基于数据生成15x5矩阵的方法。制作矩阵后,可以仔细处理带有NAN的线。我的解决方案并没有隐藏它们,而是注意到了NAN的问题。您如何知道应该缺少哪些元素?我认为这远比帮助更危险,因为OP显然对原始数据有一些根本性的误读/曲解,而默默地向数据中添加NaN并不能解决任何问题,而是隐藏了问题。放松点。我只是提供一种基于数据生成15x5矩阵的方法。制作矩阵后,可以仔细处理带有NAN的线。我的解决方案并没有隐藏它们,而是注意到了NAN的问题。