这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
Numpy ndarray数组(n维数组):
ndarray数组是由具有相同类型和相同大小的数据组成。类型有dtype参数进行指定。数组的维度大小由一个元组指定,例如(2, 3)表示两行三列的数组。
ndarray数组和Python的列表一样可以进行索引和切片。但是不同的是,ndarray可以进行共享,意味着一个ndarray是另一个ndarray的视图,当某个ndarray的元素被修改后在另一个ndarray里也是可见的。
常规操作:导包且起别名为np
In [2]: import numpy as np
创建数组的方法:创建一个类型为int32的有2行3列的ndarray数组
np.array([],dtype=x)
[]:为相同数据类型的元素值
dtype: 显式指出每个元素的数据类型(int8, int16, int32, int64, uint8, unit16, uint32, uint64, float16, float32, float64等)
In [3]: data = np.array([(1, 2, 3), (4, 5, 6)], dtype=np.int32)
In [4]: data
Out[4]:
array([[1, 2, 3],
[4, 5, 6]], dtype=int32)
进行索引操作, 跟Python的取元素的操作类似,[0]表示取第一行的元素(因为data有两个元素)
In [5]: data[0]
Out[5]: array([1, 2, 3], dtype=int32)
进行索引操作, 跟Python的取元素的操作类似,[0][0]表示取第一行的元素的第一个元素(因为data有两个元素,[0]表示取第一行的元素,然后再写[0]表示取那行的第一个元素)即取第一行第一列的元素
In [6]: data[0][0]
Out[6]: 1
进行索引操作, [0][1]表示:取第一行第二列的元素(因为data有两个元素,[0]表示取第一个的元素,然后再写[1]表示取第一个元素的第二个元素) (编程中一般以0为第一个元素)
In [7]: data[0][1]
Out[7]: 2
切片操作,得到的是原Numpy数组的一个视图,会共享数据
data[0:2, 0:2]操作的解释:
第一个0:2表示取第一行到第二行数据
第二个0:2表示取第一列到第二列的数据
上述的行列的交集就是data[0:2, 0:2]操作的结果如下:
In [8]: data2 = data[0:2, 0:2]
In [9]: data2
Out[9]:
array([[1, 2],
[4, 5]], dtype=int32)
data2[0][0]=99表示对data2数组的第一行第一列元素修改为99
In [10]: data2[0][0] = 99
对从切片操作得到的数据进行修改时需要注意的地方:
对共享数据的数组进行修改,对其他数组是可见的
因为data2是从data数据进行切片得来的,Numpy切片操作返回的是原始数组即data的一个视图,是共享数据的。所以当执行data2[0][0]=99时也是同时在修改data[0][0]上的数据,因为它们是共享同一数据的。
In [11]: data
Out[11]:
array([[99, 2, 3],
[ 4, 5, 6]], dtype=int32)
In [12]: data2
Out[12]:
array([[99, 2],
[ 4, 5]], dtype=int32)
把ndarray转换为Python列表的操作方法:
ndarray.tolist(): 此方法是Numpy数组自带的方法,表示从一个Numpy数组去生成一个Python的list对象,返回的是一个新对象,原Numpy数组还是Numpy数组。
In [18]: data[0].tolist()
Out[18]: [99, 2, 3]
返回Numpy数组副本的方法:
上面介绍了Numpy切片操作返回的是共享底层数据的,那么要返回一个完整的拷贝的话需要使用ndarray.copy()就好。
ndarray的copy方法是会对数据进行一个完整的拷贝,返回一个不共享底层数据的新narray对象:
In [22]: data3 = data.copy()
In [23]: data
Out[23]:
array([[99, 2, 3],
[ 4, 5, 6]], dtype=int32)
In [24]: data3
Out[24]:
array([[99, 2, 3],
[ 4, 5, 6]], dtype=int32)
In [25]: data == data3
Out[25]:
array([[ True, True, True],
[ True, True, True]])
下面使用Python的is进行判断是否是同一个底层对象: data is data3返回了False说明narray.copy()返回的是一个新对象
In [26]: data is data3
Out[26]: False