基础索引与切片
首先你新创建了额一个 ndarray 数组:
arr = np.arange(10)
和python的列表相似的,你可以通过索引和切片来取值
print(arr[6]) #索引从0开始
print(arr[5:8]) #顾头不顾尾
6
[5 6 7]
和列表一样,数组里的切片取值也是顾头不顾尾,并且索引是从0开始的。
重要的一个例子
arr = np.arange(10)
piece_of_arr = arr[4:6]
piece_of_arr[:] = 24
print(arr)
[ 0 1 2 3 24 24 6 7 8 9]
是的,区别于Python的内建列表,数组的切片是原数组的视图,也就意味着数据并不是被复制了一份,任何对于仕途的修改都会反映到原数组上。
相比于其他的数组编程语言都是更为急切的复制数据,由于NumPy被设计成适合处理非常大的数组,所以不会那么轻易的让开发者复制,你可以想想一下如果NumPy持续复制数据会引起多少内存问题。
但是如果你还是要一份数组切片的拷贝,而不是一份视图的话,就必须显式的复制这个数组,
比如:arr[5 : 8].copy()
数组的切片索引
import numpy as np
arr1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr1)
print('-----------')
print(arr1[:2]) #切片第1行到第2行,每一列的元素都要
print('-----------')
print(arr1[:2, 1:]) #切片第1行到第2行,第2列到最后一列
print('-----------')
print(arr1[1,:2]) #切片第2行,第1列到第2列的元素
print('-----------')
print(arr1[:,:1]) #切片每一行,第一列的元素
print('-----------')
arr1[:2, 1:] = 0 #切片第1行到第2行,第2列到最后一列的元素,并把切片结果全都改为0,所以会映射回原数组。
print(arr1)
print('-----------')
结果
[[1 2 3]
[4 5 6]
[7 8 9]]
-----------
[[1 2 3]
[4 5 6]]
-----------
[[2 3]
[5 6]]
-----------
[4 5]
-----------
[[1]
[4]
[7]]
-----------
[[1 0 0]
[4 0 0]
[7 8 9]]
-----------