数组操作的内容较多,主要以对数组的转换,数组变化形状,对数组元素进行选择和操作,以及数组元素的增删改查,数组的连接和拆分为主。每种操作都有对应的函数可以实现,需要先掌握这些函数能够实现什么功能,将函数按照功能进行划分。具体使用时从功能模块选择函数,这是最快的学习路径,可以在短时间内掌握对于数组操作的函数。不建议死记硬背函数的语法,这些函数的参数都比较多,而且可选择项也较多,在使用函数的过程中去了解参数,多练习熟能生巧。
方法 | 说明 |
---|---|
ndarray.tolist() | 将数组转为列表 |
ndarray.tostring() | 与tobytes具有完全相同的行为 |
ndarray.tobytes() | 构造包含数组中原始数据字节的 Python 字节 |
ndarray.tofile | 将数组作为文本或二进制文件写入文件 |
ndarray.tolist()
将数组转换为python列表
ndarray.tolist()
参数说明:
返回值:
示例:
>>> a = np.arange(1, 25).reshape(4,6)
>>> a
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24]])
>>> a.tolist() # 将数组转换成为python列表
[[1, 2, 3, 4, 5, 6],
[7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24]]
ndarray.tofile()
将数组以文本或者二进制的格式写入到文件中。
ndarray.tofile(fid, sep='', format='%s')
参数说明:
返回值:
示例:
>>> a = np.arange(1, 25).reshape(4,6)
>>> a
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24]])
>>> a.tofile('numpy.txt', sep='', format='%s')
ndarray.tostring()
与ndarray.tobytes()函数功能一样,将数组转换成二进制字符串。
ndarray.tostring(order='C')
参数说明:
返回值:
示例:
>>> x = np.array([[0, 1], [2, 3]], dtype=')
>>> x
array([[0, 1],
[2, 3]], dtype=uint16)
>>> x.tostring()
b'\x00\x00\x01\x00\x02\x00\x03\x00'
>>> x.tobytes()
b'\x00\x00\x01\x00\x02\x00\x03\x00'
注意:使用tostring()时会有警告提示,如下所示:
DeprecationWarning: tostring() is deprecated. Use tobytes() instead.
x.tostring()
但是仍然可以返回结果,推荐使用tobytes()
方法 | 说明 |
---|---|
ndarray.astype | 强制转换数组元素的数据类型为指定类型。 |
ndarray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)
将数组的数据类型转化为指定的数据类型。
参数:
返回值:
示例:
>>> import numpy as np
>>> a = np.array([2,4,6,8,10], dtype=np.int32)
array([ 2, 4, 6, 8, 10])
>>> a.dtype # a的数据类型为int32
dtype('int32')
>>> a.astype('int64') # 转换数据类型
array([ 2, 4, 6, 8, 10], dtype=int64)
副本:是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。
副本一般发生在:
视图:是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
视图一般发生在:
以下方法可以创建副本和视图:
方法 | 说明 |
---|---|
ndarray.copy() | 返回数组的副本。 |
ndarray.view() | 具有相同数据的数组的新视图。 |
ndarray.copy()
ndarray.copy(order='C')
返回数组的副本。
参数说明:
示例:
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
y = x.copy( order='F')
y
输出结果:
array([[1, 2, 3],
[4, 5, 6]])
注意:此函数是创建数组副本的首选方法。功能numpy.copy类似,但numpy.copy默认使用顺序’K’,并且默认不会传递子类。
ndarray.view()
返回具有相同数据的数组的新视图。数据与原数组共享。
ndarray.view([dtype][, type])
参数说明:
示例:
# 创建数组x
>>> x = np.array([(1, 2),(3,4)], dtype=[('a', np.int8), ('b', np.int8)])
>>> x
array([(1, 2), (3, 4)], dtype=[('a', 'i1'), ('b', 'i1')])
# 创建数组x的视图
>>> y = x.view(dtype=np.int8).reshape(-1,2)
>>> y
array([[1, 2],
[3, 4]], dtype=int8)
对视图进行更改会更改底层数组,示例:
>>> y[0,1] = 20 # 更改数组y的元素
>>> x # 数组x的元素也被修改
array([(1, 20), (3, 4)], dtype=[('a', 'i1'), ('b', 'i1')])
当使用ndarray的方法对数组进行操作时,如果运行完后可以直接打印出来内容的一般为创建了视图或者副本。如果运行后没有任何内容打印出来,说明该函数没有生成视图或者副本,而是对原数组进行了操作,可以打印原数组进行查看。理解返回值是什么非常重要。