这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
NumPy数组和原生Python Array(数组)之间有几个重要的区别:
- NumPy 数组在创建时具有固定的大小,与Python的原生数组对象(可以动态增长)不同。更改ndarray的大小将创建一个新数组并删除原来的数组。
- NumPy 数组中的元素都需要具有相同的数据类型,因此在内存中的大小相同。 例外情况:Python的原生数组里包含了NumPy的对象的时候,这种情况下就允许不同大小元素的数组。
- NumPy 数组有助于对大量数据进行高级数学和其他类型的操作。通常,这些操作的执行效率更高,比使用Python原生数组的代码更少。
- 越来越多的基于Python的科学和数学软件包使用NumPy数组; 虽然这些工具通常都支持Python的原生数组作为参数,但它们在处理之前会还是会将输入的数组转换为NumPy的数组,而且也通常输出为NumPy数组。换句话说,为了高效地使用当今科学/数学基于Python的工具(大部分的科学计算工具),你只知道如何使用Python的原生数组类型是不够的 - 还需要知道如何使用 NumPy 数组。
如何使两个长度相同的列表里面的相同索引/位置的数值相乘并输出到一个新列表:
Python列表的方式:
- 创建一个空的列表
- 遍历迭代相同位置的数值并两者相乘的结果追加到新列表中
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = []
for i in range(len(a)):
c.append(a[i]*b[i])
按照上述的方法,如果这个列表是数以百万的数据,循环迭代的时间将会是很长的。
Numpy是怎样的呢?
- Numpy数组a 乘以 Numpy数组b即可
c = a * b
这样Numpy的使用起来、理解起来非常形象且代码实现非常简单。
为什么Numpy那么快?
矢量化和广播.
矢量化: 代码中没有任何显式的循环,索引
传播:隐式逐元素行为
就拿上述的 c = a * b为例,这个相同位置的数组相乘的计算,这个代码实现中没有任何显式的循环和索引,也没有直接进行逐个元素的处理,即隐式地逐元素。