【小记】python 中 array 和 list 的区别
python中list 和array的区别
list和array的区别 --- python
python中list 和array的区别
List: 列表
python 中的 list 是 python 的内置数据类型,list 中的数据类型不必相同,
在 list 中保存的是数据的存放的地址,即指针,并非数据。
array:数组
array() 是 numpy 包中的一个函数,array 里的元素都是同一类型。
ndarray:
是一个多维的数组对象,具有矢量算术运算能力和复杂的广播能力,并具有执行速度快和节省空间的特点。
ndarray 的一个特点是同构:即其中所有元素的类型必须相同。
进行一个简单的比较:
import numpy as np
>>> a = [1, 2, 3, 4, 5, 6]
>>> b = np.array([1, 2, 3, 4, 5, 6])
>>> c = np.array([[1, 2, 3], [4, 5, 6]])
>>> a
[1, 2, 3, 4, 5, 6]
>>> b
array([1, 2, 3, 4, 5, 6])
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>> np.shape(b)
(6,)
>>> np.shape(c)
(2, 3)
NumPy 提供的 array() 函数可以将 Python 的任何序列类型转换为 ndarray 数组。
例如将一个列表转换成 ndarray 数组:
>>> import numpy as np
>>> a = [1, 2, 3, 4, 5, 6]
>>> b = np.array(a)
>>> b
array([1, 2, 3, 4, 5, 6])
>>> type(a)
<class 'list'>
>>> type(b)
<class 'numpy.ndarray'>
python中 list 与数组array的互相转换:
- list转array:np.array(a)
- array 转list:a.tolist()
ndarray补充知识:NumPy Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。
ndarray 内部由以下内容组成:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或 dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
ndarray 的内部结构:
跨度可以是负数,这样会使数组在内存中后向移动,切片中 obj[::-1] 或 obj[:,::-1]
创建一个 ndarray 只需调用 NumPy 的 array 函数即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
例题:
import numpy as np
a = np.array([1,2,3])
print (a)
输出:
[1, 2, 3]
# 多于一个维度
import numpy as np
a = np.array([[1, 2], [3, 4]])
print (a)
输出:
[[1, 2]
[3, 4]]
# 最小维度
import numpy as np
a = np.array([1, 2, 3,4,5], ndmin = 2)
print (a)
输出:
[[1, 2, 3, 4, 5]]
# dtype 参数
import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print (a)
输出结果如下:
[ 1.+0.j, 2.+0.j, 3.+0.j]
ndarray 对象由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置。内存块以行顺序(C样式)或列顺序(FORTRAN或MatLab风格,即前述的F样式)来保存元素。
ndarray.shape 输出一个元组
t2 = np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组
print(t2.shape) #输出元组(2, 3)
print(x.shape[0]) # 2 只输出行数
print (x.shape[1]) # 3
print(len(t2)) #2 输出行数
print(len(t2[0])) #3 输出列数
ndarray.size
输出数组元素的总个数,等于shape属性中元组元素的乘积。
ndarray.reshape数组变形
t3 = np.arange(12)
t4 = t3.reshape((3, 4)) # 改变形状,改成3行4列
print(t4)
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
np.where(条件)
返回的是元组,每个元组中的元素是array数组. np.where()并不接受list类型的参数。
—— np.where()[0] 表示行的索引;
—— np.where()[1] 则表示列的索引;
>>> a = np.arange(27).reshape(3,3,3)
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> np.where(a > 5)
(array([0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2]),
array([2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2]),
array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]))
# 符合条件的元素为
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]]
所以np.where会输出每个元素的对应的坐标,因为原数组有三维,所以tuple中有三个数组。