在Numpy数组中使用Dictionary可以使该数组具有单一数据类型

2024-06-28 19:51:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,正在学习Numpy。我读过并测试过的是np.array只有一种数据类型。当我在普通代码上使用它时,它运行良好。i、 e

import numpy as np 
np1 = np.array([1,'2' , True])

for i in np1:
   print(type(i))

答案是

<class 'numpy.str_'>
<class 'numpy.str_'>
<class 'numpy.str_'>

但是当我的代码是

np2 = np.array([{1:1 , 2:2 }, 1 , True , '1'])
for i in np2:
    print(type(i))

答案是

<class 'dict'>
<class 'int'>
<class 'bool'>
<class 'str'>

这表明元素不属于上面的numpy类,答案是<class 'numpy.str'>。 当我打印print(type(np2))时,答案是<class 'numpy.ndarray'>。 你能解释一下为什么它们不是同一种数据类型吗。?谢谢


Tags: 答案代码innumpytruefortypenp
3条回答

如果未给出阵列所需的数据类型,则类型“将被确定为在序列中保存对象所需的最小类型。

在第一种情况下,最小类型为str,因为每个项都可以转换为字符串。新数组包含字符串

在第二种情况下,最小类型是object(因为<class 'str'>dict不能转换为字符串)。新数组包含对对象的引用。每个对象都有自己的类型

您可以强制np1成为对象数组:

np1 = np.array([1, '2' , True], dtype=object)
type(np1[0]))
#<class 'int'>
type(np1[1]))
#<class 'str'>
type(np1[2]))
#<class 'bool'>

请参阅documentation。它支持的第一个特性是

a powerful N-dimensional array object

因此,它将任何元素作为对象处理

还有一件事:

Besides its obvious scientific uses, NumPy can also be used as an efficient multi-dimensional container of generic data. Arbitrary data-types can be defined. This allows NumPy to seamlessly and speedily integrate with a wide variety of databases.

因此,如果可能的话,NumPy数组会高效地将其元素存储为相同的数据类型,以优化性能

在交互式ipython会话中,数组等对象以其repr表示形式显示。我发现这是一个非常有用的信息:

In [41]: np1 = np.array([1,'2' , True])                                                                   
In [42]: np1                                                                                              
Out[42]: array(['1', '2', 'True'], dtype='<U21')

注意引号和U21数据类型。两者都显示数组包含字符串,数字和布尔值都已转换为公共字符串数据类型

In [43]: np2 = np.array([{1:1 , 2:2 }, 1 , True , '1'])                                                   
In [44]: np2                                                                                              
Out[44]: array([{1: 1, 2: 2}, 1, True, '1'], dtype=object)
In [45]: [{1:1 , 2:2 }, 1 , True , '1']                                                                   
Out[45]: [{1: 1, 2: 2}, 1, True, '1']

注意object数据类型。元素显示基本上与列表相同。这样的数组实际上是一个列表。虽然有一些不同,但出于许多目的,它可以被视为一个列表。它与列表相比没有什么优势,但也有一些缺点。它没有数值numpy数组的计算速度

对象数据类型数组的数据缓冲区类似于列表的底层缓冲区。两者都包含指向存储在内存中其他位置的对象的指针或引用。从这个意义上讲,它只有一种数据类型——引用

===

如果我创建一个列表,然后从该列表中创建一个对象数据类型数组:

In [48]: alist = [{1:1 , 2:2 }, 1 , True , '1']                                                           
In [49]: arr = np.array(alist)                                                                            
In [50]: arr                                                                                              
Out[50]: array([{1: 1, 2: 2}, 1, True, '1'], dtype=object)

我可以显示数组中的字典与列表中的字典相同。它们具有相同的id

In [51]: id(arr[0])                                                                                       
Out[51]: 140602595005568
In [52]: id(alist[0])                                                                                     
Out[52]: 140602595005568

以及对列表的修改,将显示在阵列中:

In [53]: alist[0][3]=3                                                                                    
In [54]: arr                                                                                              
Out[54]: array([{1: 1, 2: 2, 3: 3}, 1, True, '1'], dtype=object)

相关问题 更多 >