一维数组类似于一条直线(一维),其上的坐标位置用一个数字就可表示,一个数字代表一个位置,对应一个值。
>>> b=np.random.randint(1,10,[10])
>>> b
array([6, 5, 2, 3, 9, 9, 3, 8, 5, 8])
# 正向第i个元素到第j个元素:
>>> i=1
>>> j=8
>>> b[i:j]
array([5, 2, 3, 9, 9, 3, 8])
# 返回b[i],b[i+1],···,b[j-1]的元素
>>> i=1
>>> j=2
>>> b[i:j]
array([5])
# 左闭右开,第j个元素不返回。
>>> b[::2]
array([6, 2, 9, 3, 5])
# 反向 倒数几个元素:
# start和end为负数则是反向取元素,
# 取b[start+1] ,b[start+2],···,b[end]的元素
>>> b[-3:-1]
array([8, 5])
二维数组类似于一个平面(二维),其上的坐标位置要用两个数字来表示,两个数字代表一个位置,对应一个值。
>>> a=np.random.randint(0,10,size=[4,5])
>>> a
array([[1, 8, 4, 9, 8],
[4, 1, 6, 4, 2],
[6, 4, 1, 2, 7],
[4, 9, 3, 5, 9]])
# 取 第i行到第j行:
>>> a[2:4,:]
array([[6, 4, 1, 2, 7],
[4, 9, 3, 5, 9]])
# 第i列到第j列:
>>> a[:,2:4]
array([[4, 9],
[6, 4],
[1, 2],
[3, 5]])
多维的切片是在中括号中用逗号运算符, 将不同维上的操作分开,分割开后每个维度上单独维护即可。
# coding: utf-8
import numpy as np
arr = np.arange(24).reshape((2, 3, 4))
print arr[1, ...] # 等价于 arr[1, :, :]
print arr[..., 1] # 等价于 arr[:, :, 1]
>>> a[:1,:1]=[[100]]
>>> a
array([[100, 8, 4, 9, 8],
[ 4, 1, 6, 4, 2],
[ 6, 4, 1, 2, 7],
[ 4, 9, 3, 5, 9]])
访问多维数组的一个特定位置的元素
# array的用法
import numpy as np
arr = np.array([
[1, 2, 3, 4],
[2, 4, 6, 8],
[3, 6, 9, 12],
[4, 8, 12, 16]
])
print('第二行第二列的值:', arr[1, 1])
# list的用法
# coding: utf-8
arr = [
[1, 2, 3, 4],
[2, 4, 6, 8],
[3, 6, 9, 12],
[4, 8, 12, 16]
]
print('第二行第二列的值:', arr[1][1])
list的用法array也可以那样用,对于array来说,arr[1][1]就是先取出arr的第一行,然后再取arr的第一行的第一个。对于array来说,arr[index]——括号中的索引值只有一个的话,只能表示对array的第一个维度进行索引;arr[index][index]——表示先取出arr的第一个维度的index,再取出arr[index]的index。
如果只是二维数组,这种差别可能看起来并不大,但想象一下假如有一个 10 维的数组,用 Python 的标准做法需要写 10 对中括号,而用 Numpy 依然只需要一对。
用一个由 boolean 类型值组成的数组来选择元素的方法。如果要取其中 值大于 5 的元素,就可以用上 boolean index 了.
import numpy as np
arr = np.array([[1, 2, 3, 4],
[2, 4, 6, 8],
[3, 6, 9, 12],
[4, 8, 12, 16]])
mask = arr > 5
print('boolean mask is:')
print(mask)
print(arr[mask])
首先明确:array索引的标准用法是array[index,index]
import numpy as np
a=np.random.randint(0,10,size=[4,5])
a
a[:][0]
a[:,0]
对于多维数组(超过2),如果索引值只有一个数字,表示一个维度,那就表示对该多维数组的第一个维度进行索引。
import numpy as np
a = np.random.rand(2,2,2,2)
a
对于多维数组(超过2),如果索引值有多个数字,表示多个维度,那就表示对该多维数组的对应位置顺序的多个维度同时进行索引。
以上看不出两者的区别,看下面的示例。
显然,上面的示例中,a[:][0]表示先取出a数组的所有行,再取出其中的第0行。而a[:,0]表示取出a数组的所有行和第0列。
再看下面的例子
上面的例子表示对多维数组的最后一个维度进行循环。而下面的例子表示对多维数组的第一个维度进行循环。因为a[:][:][:][c]的前面a[:][:][:]只能表示取出a的所有行,最后a[:][:][:][c]的c才能表示取出a的第一个维度中的第c个。