如何在python3中创建具有混合类型的多维数组?

如何在python3中创建具有混合类型的多维数组?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我不知道为什么我总是喜欢用numpy做一些简单的事情。也许我只是想起了一些错误,用键和值来创建数组的最佳方法是什么 我试过: group_a = np.array[{"russia" : 0}, {"saudi_arabia" : 0}, {"egypt" : 0}, "uruguay" : 0}] TypeError:“内置函数”或“方法”对象不可下标 & ValueError:仅接受2个非关键字参数 & 我感到困惑。np.array是一个函数,所以您不能使用[]订阅它。在第二种情况下,您

我不知道为什么我总是喜欢用numpy做一些简单的事情。也许我只是想起了一些错误,用键和值来创建数组的最佳方法是什么

我试过:

 group_a = np.array[{"russia" : 0}, {"saudi_arabia" : 0}, {"egypt" : 0}, "uruguay" : 0}]
TypeError:“内置函数”或“方法”对象不可下标

&

ValueError:仅接受2个非关键字参数

&


我感到困惑。

np.array
是一个函数,所以您不能使用
[]
订阅它。在第二种情况下,您输入的词典列表错误,您应该列出它们,然后将其传递给第一个参数。现在,您正在传递一个字典作为函数的参数。因此,这应该是可行的:

np.array([{"russia" : 0}, {"saudi_arabia" : 0}, {"egypt" : 0}, {"uruguay" : 0}])

首先是
np.array
的签名:

array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
它是一个函数,使用
()
。它接受一个位置参数,通常是一个列表。其他参数被解释为关键字参数、
dtype
copy

我们可以列一个字典列表:

In [543]: alist = [{"russia" : 0}, {"saudi_arabia" : 0}, {"egypt" : 0}, {"urugua
     ...: y" : 0}]
In [544]: alist
Out[544]: [{'russia': 0}, {'saudi_arabia': 0}, {'egypt': 0}, {'uruguay': 0}]
我们可以从这个列表中创建一个数组。请注意
dtype
。阵列为1d

In [545]: arr = np.array(alist)
In [546]: arr
Out[546]: 
array([{'russia': 0}, {'saudi_arabia': 0}, {'egypt': 0}, {'uruguay': 0}],
      dtype=object)
但是你为什么不用多个键来编一本字典呢?单元素字典的列表或数组看起来不是很有用

In [548]: adict = {"russia" : 0, "saudi_arabia" : 0, "egypt" : 0,"uruguay" : 0}
In [549]: adict
Out[549]: {'russia': 0, 'saudi_arabia': 0, 'egypt': 0, 'uruguay': 0}
比较获取字典键的方法:

In [550]: alist[2].keys()
Out[550]: dict_keys(['egypt'])
In [551]: adict.keys()
Out[551]: dict_keys(['russia', 'saudi_arabia', 'egypt', 'uruguay'])
In [552]: [d.keys() for d in arr]
Out[552]: 
[dict_keys(['russia']),
 dict_keys(['saudi_arabia']),
 dict_keys(['egypt']),
 dict_keys(['uruguay'])]

In [554]: np.array([list(d.items()) for d in alist],object)
Out[554]: 
array([[['russia', 0]],

       [['saudi_arabia', 0]],

       [['egypt', 0]],

       [['uruguay', 0]]], dtype=object)
In [555]: _.shape
Out[555]: (4, 1, 2)    # multidimensional object array
In [556]: __[:,0,0]
Out[556]: array(['russia', 'saudi_arabia', 'egypt', 'uruguay'], dtype=object)
我们还可以从
adict
(也可以从
alist
间接创建结构化数组):

[559]中的
:list(adict.items())#生成元组列表
出[559]:[('russia',0),('saudi_arabia',0),('egypt',0),('乌拉圭',0)]
在[561]中:sarr=np.array(list(adict.items()),dtype='U20,int')
在[562]中:sarr
出[562]:
数组([('russia',0),('saudi_arabia',0),('egypt',0),('乌拉圭',0)],

dtype=[('f0',“你为什么想要这样的
numpy.array
?你应该先问自己这个问题,因为
numpy
是用来处理原始数字类型的,而不是对象。这不是一件简单的事。你正在尝试构造一个不寻常的数组。
In [550]: alist[2].keys()
Out[550]: dict_keys(['egypt'])
In [551]: adict.keys()
Out[551]: dict_keys(['russia', 'saudi_arabia', 'egypt', 'uruguay'])
In [552]: [d.keys() for d in arr]
Out[552]: 
[dict_keys(['russia']),
 dict_keys(['saudi_arabia']),
 dict_keys(['egypt']),
 dict_keys(['uruguay'])]

In [554]: np.array([list(d.items()) for d in alist],object)
Out[554]: 
array([[['russia', 0]],

       [['saudi_arabia', 0]],

       [['egypt', 0]],

       [['uruguay', 0]]], dtype=object)
In [555]: _.shape
Out[555]: (4, 1, 2)    # multidimensional object array
In [556]: __[:,0,0]
Out[556]: array(['russia', 'saudi_arabia', 'egypt', 'uruguay'], dtype=object)
In [559]: list(adict.items())    # produces a list of tuples
Out[559]: [('russia', 0), ('saudi_arabia', 0), ('egypt', 0), ('uruguay', 0)]

In [561]: sarr = np.array(list(adict.items()),dtype='U20,int')
In [562]: sarr
Out[562]: 
array([('russia', 0), ('saudi_arabia', 0), ('egypt', 0), ('uruguay', 0)],
      dtype=[('f0', '<U20'), ('f1', '<i8')])
In [563]: sarr['f0']
Out[563]: array(['russia', 'saudi_arabia', 'egypt', 'uruguay'], dtype='<U20')
In [564]: sarr['f1']
Out[564]: array([0, 0, 0, 0])