tolist()将ndarray变为list

前言:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的贝塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值