目录
前言
Numpy的核心特征之一就是N-维数组对象。
一、生成ndarray
1. array函数
创建数组的方式有很多,第一种是使用array
import numpy as np
data1 = [[1, 2, 3], [5 ,6 ,7]]
arr1 = np.array(data1)
print(f'arr1 is {arr1}')
print(f'shape is {arr1.shape}')
结果:
arr1 is [[1 2 3]
[5 6 7]]
shape is (2, 3)
2. zeros或empty
代码:
import numpy as np
data1 = np.zeros(10)
print(f'data1 is {data1}')
data2 = np.zeros((3, 6))
print(f'data2 is {data2}')
data3 = np.empty(((2, 3, 2)))
print(f'data3 is {data3}')
结果:
data1 is [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
data2 is [[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]]
data3 is [[[6.23042070e-307 1.89146896e-307]
[3.44897822e-307 1.33511290e-306]
[3.11525958e-307 3.33774660e-307]]
[[8.01097889e-307 1.24611538e-306]
[1.60221072e-306 6.89804132e-307]
[1.11261162e-306 8.34443015e-308]]]
由此可见,用np.empty来生成全0数组并不可靠。
3. arange
代码:
import numpy as np
data1 = np.arange(15)
print(f'data1 is {data1}')
data2 = range(0, 15)
print(data2)
结果:
data1 is [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
range(0, 15)
由此可见,不可以用range函数生成数组
4. 其他
代码:
import numpy as np
#生成一个0-14的一维数组
data1 = np.arange(15)
print(f'data1 is {data1}')
data_1 = np.arange(2, 10)
print(data_1)
data_2 = np.arange(2, 10, 3)
print(data_2)
#生成和data1形状相同的全是0的数组
data2 = np.zeros_like(data1)
print(f'data2 is {data2}')
#生成全是1的数组
data3 = np.ones(15)
print(f'data3 is {data3}')
data_3 = np.ones((2, 4))
print(f'data_3 is {data_3}')
#根据给定的形状和数据类型生成指定数值的数组
data4 = np.full((2, 3), 5)
print(f'data4 is {data4}')
结果:
data1 is [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
[2 3 4 5 6 7 8 9]
[2 5 8]
data2 is [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
data3 is [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
data_3 is [[1. 1. 1. 1.]
[1. 1. 1. 1.]]
data4 is [[5 5 5]
[5 5 5]]
二、Numpy数组算术
加减乘除是比较简单的,不再赘述。
同尺寸数组之间的比较,会生成一个布尔值数组
代码:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr1 = arr ** 2
print(f'arr1 is {arr1}')
arr2 = arr ** 0.5
print(f'arr2 is {arr2}')
brr = np.array([[0, 4, 1], [7, 2, 12]])
brr1 = brr > arr
print(brr1)
结果:
arr1 is [[ 1 4 9]
[16 25 36]]
arr2 is [[1. 1.41421356 1.73205081]
[2. 2.23606798 2.44948974]]
[[False True False]
[ True False True]]
在进行不同尺寸数组间的操作时,会用到广播特性。后续进行介绍。
三、基础索引与切片
1. 一维数组
import numpy as np
arr = np.arange(15)
print('arr')
print(arr)
arr1 = arr[4]
print('arr1')
print(arr1)
arr2 = arr[2:10]
print('arr2')
print(arr2)
arr[3:9] = 1000
print('new arr')
print(arr)
arr[:] = 20
print('arr')
print(arr)
arr[2:] = 0
print(arr)
arr[:3] = 1
print(arr)
结果:
arr
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
arr1
4
arr2
[2 3 4 5 6 7 8 9]
new arr
[ 0 1 2 1000 1000 1000 1000 1000 1000 9 10 11 12 13
14]
arr
[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20]
[20 20 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0]
2. 多维数组
(1)索引
对于对为数组,每个索引值对应的不是一个值,而是一个数组。
代码:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
print(arr[2])
print(arr[2][0])
print(arr[2, 0])
#由此可见,arr[2][0]与arr[2, 0]是等效的
结果:
[[1 2 3]
[4 5 6]
[7 8 9]]
[7 8 9]
7
7
(2)切片
代码:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
'进行单组切片'
print()
print(arr[:2]) #取前两行
print(arr[2:]) #从第2行开始取,一直取到最后
'进行多组切片'
print()
print(arr[:2, 1:])
结果:
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]]
[[7 8 9]]
[[2 3]
[5 6]]
(3)索引与切片混合
代码:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
'索引与切片混合'
print()
print(arr[1, :2])
print()
print(arr[:2, 2])
结果:
[[1 2 3]
[4 5 6]
[7 8 9]]
[4 5]
[3 6]
注意:单独一个冒号表示选择整个轴上的数组
代码:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
'索引与切片混合'
print()
print(arr[:, :1])
print()
print(arr[:, :2])
print()
print(arr[1:, 2])
结果:
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1]
[4]
[7]]
[[1 2]
[4 5]
[7 8]]
[6 9]
总结
目前来看这本书比较简单,这个系列希望可以在文章中多一些例子和练习,以便更容易理解、印象更加深刻。