前言:
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。
ndarray本质是数组,但其与Python 的list的不同点在于它可以有N 维(dimentions)
同时Numpy为ndarray提供了便利的操作函数,而且性能优越,因此在数值计算,机器学习,人工智能,神经网络等领域广泛应用。
Numpy几乎是Python 生态系统的数值计算的基石,例如Scipy,Pandas,Scikit-learn,Keras等都基于Numpy。
进入正题:
遇到的问题:
今天在读取一个只包含一个dict对象(该dict对象含有两个ndarray数组)的ndarray对象时遇到了问题,因为我输出该ndarray对象,直接输出的是整个dict,我想输出dict中的某个数组。因为数组对象ndarray中实际上只有一个元素(即输出其shape为()),那就是dict对象,因此无法通过索引输出dict中的某个数组。因此需要将其变回dict对象,怎么变回呢?我首先使用的是list()函数,发现会出现TypeError: iteration over a 0-d array错误提示,后来通过tolist()方法解决了这个问题。
源码如下:
import numpy as np
x = np.arange(10)
y = np.sin(x)
dct = {'x': x, 'y': y}
a = np.array(dct)
print(type(a), a.shape, a.dtype) # type()函数可以查看变量的类型 ,而dtype属性是查看数组中元素的类型。
print(list(a)) # print(type(a.tolist()), a.tolist()['x'])
运行结果:
当使用tolist时的结果如下,可以看出此时已经将其转化为dict对象,可以输出其中的某个数组:
下面记录一下官方给出的Numpy中的tolist()方法:
1.该方法是将ndarray数组对象变为嵌套的多层的list(层数为ndarray的维数)返回。
2.若ndarray的shape=(),则list的层数为0,即返回的不是list,而是将ndarray中的数据项变为所兼容的python内置标量返回。(上面我遇到的问题因为ndarray中的数据项为dict对象所以返回的是一个dict类对象)
>>> a = np.array(1)
>>> list(a)
Traceback (most recent call last):...
TypeError: iteration over a 0-d array
>>> a.tolist()
1
3.若ndarray为1维数组,tolist()的方法几乎等效于list(),但是有一点不同的是前者会把ndarray的数据项变为兼容的python内置的标量。
>>> a = np.uint32([1, 2])
>>> a_list = list(a)
>>> a_list
[1, 2]
>>> type(a_list[0])
<class 'numpy.uint32'>
>>> a_tolist = a.tolist()
>>> a_tolist
[1, 2]
>>> type(a_tolist[0])
<class 'int'>
3.若ndarray为2维数组,tolist()的方法会递归调用,而list方法并不会递归调用
>>> a = np.array([[1, 2], [3, 4]])
>>> list(a)
[array([1, 2]), array([3, 4])]
>>> a.tolist()
[[1, 2], [3, 4]]
参考文献
Numpy官方tolist方法:https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tolist.html