python教程,如何理解ndarray和list使用时的异同之处?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文话题继续说基于python
的ndarray
类型和list
类型的差异,总体上来说,两者是差不多的。但是,有一些重要的差异之处的,两者的表现差异性极强。
大家好,这里是苏南大叔的“程序如此灵动”博客,本文以上一篇ndarray
的出人意料之处为出发点,描述ndarray
和list
类型的一些重要差异点。本文测试环境:win10
,python@3.11.0
,numpy@1.24.2
,pandas@1.5.3
。
前文提示
本文的正确理解,需要您查看以下两篇文章:
ndarray
之所以会给苏南大叔造成重大的意外,就是因为上文所说的两个对成员进行设置的地方。那么,本文也是基于上述的意外点展开阐述的。
初始值对后续值的影响不同
初始值的内存容量对后续值有重大影响的是ndarray
,list
类型没有影响!差异明显!
测试代码:
import numpy as np
s1 = [["苏", "南", "大", "叔"], ["北", "京", "大", "学"]]
s2 = np.array(s1)
s1[0:2][0][2]= "豪豪豪"
s2[0:2][0][2]= "豪豪豪"
print(s1)
print(s2)
输出:
[['苏', '南', '豪豪豪', '叔'], ['北', '京', '大', '学']]
[['苏' '南' '豪' '叔']
['北' '京' '大' '学']]
对于ndarray
来说,初始成员的长度最大值,限制了后续被修改的成员的长度最大值。
对一组数据设置的结果不同
对一组或几组数据进行设置的时候,ndarray
是改变所有的成员变量,而list
是整体替换这几组数据。差异明显!
测试代码:
import numpy as np
s1 = [["苏", "南", "大", "叔"], ["北", "京", "大", "学"]]
s2 = np.array(s1)
s1[0:1] = "叔"
s2[0:1] = "叔"
print(s1)
print(s2)
输出:
['叔', ['北', '京', '大', '学']]
[['叔' '叔' '叔' '叔']
['北' '京' '大' '学']]
import numpy as np
s1 = [["苏", "南", "大", "叔"], ["北", "京", "大", "学"]]
s2 = np.array(s1)
s1[:] = "叔"
s2[:] = "叔"
print(s1)
print(s2)
输出:
['叔']
[['叔' '叔' '叔' '叔']
['叔' '叔' '叔' '叔']]
输出不同
这个print
的输出结果,两者也有很大不同。
list
是用逗号隔开的,[]
之间没有换行。ndarray
是用空格隔开的,[]
之间,多一层多个换行。pycharm
可以对ndarray
可视化,确不支持对list
类型的可视化。
整体直接运算
这里以乘法运算为例,
list
是直接成员数量加倍。ndarray
是数字类型数字翻倍,字符类型直接出错。
import numpy as np
s1 = [1,2]
s2 = np.array(s1)
print(s1*2) # [1, 2, 1, 2]
print(s2*2) # [2 4]
s1 = [[1,2]]
s2 = np.array(s1)
print(s1*2) # [[1, 2], [1, 2]]
print(s2*2) # [[2 4]]
另外一个例子:
import numpy as np
s1 = [[1,2], ["北", "京"]]
s2 = np.array(s1)
print(s1*2) # [[1, 2], ['北', '京'], [1, 2], ['北', '京']]
print(s2*2) # numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not
对字符串型的ndarray
,做乘方运算的时候,报错如下:
Traceback (most recent call last):
File "C:\Users\sunan\Desktop\demo\py\t.py", line 15, in <module>
print(s2*2)
numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U11'), dtype('<U11')) -> dtype('<U11')
结束语
没有啥话可说,存在即为合理,既然两者是不同的数据类型,必然有其差异之处!目前看到的差异是这些,不排除将来再继续进行补充!都是苏南大叔自己总结的内容,不妥之处欢迎留言指正。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。