1. list和ndarray
最大区别在于在内存中存储方式不同
相同:
- 列表 ( list ) 与数组(ndarray)类似,是具有相同类型的多个元素构成的整体。
- list和array都可以根据索引、切片来取其中的元素。
区别:
-
数组在内存中是连续的,数组里的元素都是同一类,所以一旦确定了一个数组,它的内存就确定了,因此不能像列表一样通过.append()追加。列表中保存的是数据的存放的地址,简单的说就是指针并非数据,所以可以可以存储不同的类型,由于地址不用连续,所以可以通过.append()把元素的地址追加进去,由于每个元素都需要一个地址,增加了堆内存和CPU的开支。
-
列表不能对整体进行数值运算,但是数组能对整体进行数值运算 。
-
数组底层使用C语言编写,运算速度快,并且具有强大的运算能力。
import numpy as np
# 1. 列表
a = [1, 2]
a.append(3)
print("数组可以追加为:", a)
# 2. 数组
b = np.array([1, 2])
# b.append(3) # 会报错“'numpy.ndarray' object has no attribute 'append'”
2. ndarray和tensor
最大区别在于值是否可以改变(数据运行的设备)
相同:
- tensor内部的数据类型为ndarray类型
区别:
- tensor可以有加速器内存(如GPU)支持,既可以在CPU上运行也可以在GPU上运行。ndarray只能在CPU上运行。
- ndarray在CPU上运行,因此可以改变其数值。tensor的值可以驻留在GPU上加速,GPU不具有改变元素值的能力,因此tensor的值不可以改变。
import tensorflow as tf
import numpy as np
# 1. ndarray
a = np.array([1, 2, 3])
a[1] = 3
print("可以改变数组值为:", a)
# 2. tensor
b = tf.constant([1, 2, 3])
# b[1] = 3 # 会报错“'tensorflow.python.framework.ops.EagerTensor' object does not support item assignment”