NumPy 是 Python 科学计算的基础包。它是一个 Python 库,提供了一个多维数组对象、各种派生对象(例如掩码数组和矩阵),以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。
NumPy 包的核心是ndarray对象
NumPy 数组比 Python 列表更快、更紧凑。数组占用内存少,使用方便。NumPy 使用更少的内存来存储数据,它提供了一种指定数据类型的机制。这允许进一步优化代码
轴数(有几层就有几个轴)
b = np.array([[[5, 6],[5,2],[2,3]]])##3轴
c=np.array([[[[3,5],[2,3],[3,2]]]])##4轴
(axio=0是向下(y轴),axio=1的轴是横着的(x轴),axio=None就是把矩阵看成一个数组比较即可)
axis=0时
np.array([[1,7,3,11,5,6,10,8]]).reshape(4,2)
[[ 1 7]
[ 3 11]
[ 5 6]
[10 8]]
np.sort(a,axis=0)
[[ 1 6]
[ 3 7]
[ 5 8]
[10 11]]
我们来看看上面axis=0时的代码:我的理解是每次向下比较如:第一次选出(1,3,5,10)的最小值为第一列的第一个值再比(7,11,6,8)的最小值放在第二列第一个就产生了(1,6),按上面的规则继续比较就得出来了
axio=1时
a=np.array([[1,7,3,11,5,6,10,8]]).reshape(2,4)
[[ 1 7 3 11]
[ 5 6 10 8]]
np.sort(a,axis=1)
[[ 1 3 7 11]
[ 5 6 8 10]]
不用我说了吧,常规排序
axio=None
np.array([[1,4],[3,1]])
np.sort(a, axis=None) # sort the flattened array
array([1, 1, 3, 4])
我们可以初始化 NumPy 数组的一种方法是从 Python 列表中,对二维或更高维数据使用嵌套列表
注意:参数能传一个数组,一个数组里可以无限嵌套,而且每个相同等级的数组的个数必须相等 ,否则会装换成列表.
b = np.array([[5, 6],[5,2],[2]])
[list([5, 6]) list([5, 2]) list([2])]
c=np.array([[3,5],[2,3],[3,2]])
[[3 5]
[2 3]
[3 2]]
例如:
1.
a=np.array([[1,2,3,4],[5,6,7,8]])
print(a)
[[1 2 3 4]
[5 6 7 8]]
print(a[0])
[1 2 3 4]
注意这段代码,array里面是传入的是一个列表,从一个列表中再嵌套其他列表。然后直接输出一个矩阵。
2. 填充数组,创建数组
b=np.zeros(3)
print(b)
[0. 0. 0.]
b=np.zeros(2)
print(b)
[0. 0.]
。。。。。。。。。。。。。。。
np.ones(2)##填充1
np.empty(4)##填充随机数
np.arange(4)##顺序填充从0开始 [0 1 2 3]
e=np.arange(2,9,3)##填充从2开始步长为3结尾可取8的数组
np.linspace(0, 6, num=10)##数量为10个范围时0到10。会有随机的空格
[0. 0.66666667 1.33333333 2. 2.66666667 3.33333333
4. 4.66666667 5.33333333 6. ]
5. np.ones((4, 3, 2)) ##4个,三行,2列都为一的数组
注意:这些自动填充的数组,都是填充的是浮点数,那么如何指定填充类型呢? 答案在那些自动填充的函数中加参数dtype=
np.linspace(0,6,num=10,dtype=int)
[0 0 1 2 2 3 4 4 5 6]##与上面做对比是不是改变了呢
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
print(np.concatenate((a,b)))
注意:看清楚这个两个数组是放在了括号中否则会报错
TypeError: only integer scalar arrays can be converted to a scalar index
b = np.array([[[5, 6],[5,2],[2,3]]])
print(b.ndim)##查看有几个轴
print(b.size)##大小(数的所以个数)
print(a.shape)##形状
shape
a = np.array([1, 2, 3, 4])
b = np.array([[5, 6,3],[5,2,3],[2,3,3]])
d = np.array([[[5, 6,6],[5,2,5],[2,3,4]]])
c=np.array([[[[3,5],[2,3],[3,2]],[[3,5],[2,3],[3,2]]]])
print(b)
print(a.shape)
print(b.shape)
print(d.shape)
print(c.shape)
(4,)
(3, 3)
(1, 3, 3)
(1, 2, 3, 2)
1.有一个轴就会输出几个数
2.最后一个值是每个小数组的值得个数,我发现每个小数组的个数都要相等(猜测)
总结,从前往后显示的是,从外层到最里层每层的元素个数。
a = np.arange(6)
b = a.reshape(3, 2)
print(b)
[[0 1]
[2 3]
[4 5]]
reshape(行,列)两个参数想乘要等于元素个数.
numpy.reshape(a, newshape=(1, 6), order='C')
array([[0, 1, 2, 3, 4, 5]])
a 是要重塑的数组。
newshape是你想要的新形状。您可以指定一个整数或一个整数元组。如果您指定一
个整数,结果将是该长度的数组。形状应与原始形状兼容。
order: C表示使用类似 C 的索引顺序F读取/写入元素, 表示使用类似 Fortran
的索引顺序A 读取/写入元素,表示如果 a 在内存中是 Fortran 连续的,则表示
以类似 Fortran 的索引顺序读取/写入元素,C - 否则类似订单。(这是一个可选
参数,不需要指定。)
a = np.array([1, 2, 3, 4, 5, 6])
a.shape
(6,)
a2 = a[np.newaxis, :]
a2.shape
(1, 6)
指定添加轴的位置
a = np.array([[1, 2, 3],[ 4, 5, 6]])
b = np.expand_dims(a, axis=1)
c = np.expand_dims(a, axis=0)
print(b)
print(c)
print(b.shape)
print(c.shape)
[[[1 2 3]]
[[4 5 6]]]
[[[1 2 3]
[4 5 6]]]
(2, 1, 3)
(1, 2, 3)
理解:
axis=0是y轴是从外到里的每层的个数(1,2,3)
axis=1是x轴就是把最前面两个数交换的位置,(我也搞不懂)
a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(a[a < 5])
[1 2 3 4]
c = a[(a > 2) & (a < 11)]
print(c)
[ 3 4 5 6 7 8 9 10]
c=(a<5)
[[ True True True True]
[False False False False]
[False False False False]]
re=np.nonzero(a<5)##输出下标
print(re)
(array([0, 0, 0, 0, 1], dtype=int64), array([0, 1, 2, 3, 1],
dtype=int64))
()返回true与false,a[()],(a[])返回的是值
还符合||,&&,*,<等逻辑运算符
垂直堆叠(vstack)
a=np.array([[1,2],
[4,5]])
b=np.array([[6,9],
[2,5]])
print(np.vstack((a,b)))
[[1 2]
[4 5]
[6 9]
[2 5]]
水平堆叠(hstack)
a=np.array([[1,2],
[4,5]])
b=np.array([[6,9],
[2,5]])
print(np.hstack((a,b)))
[[1 2 6 9]
[4 5 2 5]]
a=np.ones(3)
b=np.array([2,3,4])
print(a+b) [3. 4. 5.]
print(b-a) [1. 2. 3.]
print(a*b) [2. 3. 4.]
print(b/a) [2. 3. 4.]
print(a*4)所有乘以4 [4. 4. 4.]
data = np.array([[1, 2], [3, 4], [5, 6]])
ones_row = np.array([[1, 1]])
data + ones_row 这是跟每一个数组相加
array([[2, 3],
[4, 5],
[6, 7]])
元素之和
b=np.array([[2,3,4],[2,3,4]])
print(b.sum(axis=0))##y轴的和
[4 6 8]
axis=1是x的和
不写就是所有的和
b=np.array([[2,3,4],[1,3,4]])
print(b.min()) 1
print(b.max()) 4
data = np.array([[1, 2], [3, 4], [5, 6]])
print(data[1,1]) ##第二个的第二个元素
4
print(data[1:3]) ## 1,2小标的元组
[[3 4]
[5 6]]
print(data[0:2,0])##0.1的第一个元素
[1 3]
data = np.array([[1, 2], [2, 4], [4, 6]])
data_value=np.unique(data)
[1 2 4 6]
data_value,indices_list=np.unique(data,return_index=True),注意
这儿是有两个变量
print(indices_list)
[0 1 3 5] 返回的下标
data_value,counts=np.unique(data,return_counts=True)
[1 2 2 1] 每个值出现的频率
unique_value=np.unique(data,axis=0) 传了参数后是比较的数组是否唯一
print(unique_value)
[[1 2]
[2 4]
[4 6]]
data = np.array([[2,4,4,2, 4,4,4, 6,6,10]])
re1=data.reshape(5,2)
print(re1)
print(re1.transpose())
print(re1.T)
[[ 2 4]
[ 4 2]
[ 4 4]
[ 4 6]
[ 6 10]]
[[ 2 4 4 4 6]
[ 4 2 4 6 10]]
[[ 2 4 4 4 6]
[ 4 2 4 6 10]]
data = np.array([[2,4,4,2, 4,4,4, 6,6,10]])
print(np.flip(data))
[[10 6 6 4 4 4 2 4 4 2]]
二维
把所有元素数组大小都反转
arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
print(np.flip(arr_2d))
[[12 11 10 9]
[ 8 7 6 5]
[ 4 3 2 1]]
反转列的,我的理解是列,但是官方文档说是行
print(np.flip(arr_2d,axis=0)) 同样axis可以为1
[[ 9 10 11 12]
[ 5 6 7 8]
[ 1 2 3 4]]
这只反转的数组中的元素,而没有反转数组的顺序
print(np.flip(arr_2d[1]))
指定某一个数组反转
arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr_2d.flatten())
print(arr_2d.ravel())
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
用help,如
help(max)
输出:
max(...)
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value
With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
np.save('./test.npy',arr_2d)
load=np.load('./test.npy')
print(load)
NumPy 数组保存为纯文本文件,例如**.csv或.txt**文件,用np.savetxt
arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
np.savetxt('./test2.csv',arr_2d)
load=np.loadtxt('./test2.csv')
print(load)
读取包含现有信息的 CSV ,最好和最简单的方法是使用 Pandas。
使用 Matplotlib 绘制数组(这个就不写了和这个标题不符)
附几段几个代码就可以了
import pandas as pd
x = pd.read_csv('music.csv', header=0).values
print(x)
[['Billie Holiday' 'Jazz' 1300000 27000000]
['Jimmie Hendrix' 'Rock' 2700000 70000000]
['Miles Davis' 'Jazz' 1500000 48000000]
['SIA' 'Pop' 2000000 74000000]]
x = pd.read_csv('music.csv', usecols=['Artist', 'Plays']).values
print(x)
[['Billie Holiday' 27000000]
['Jimmie Hendrix' 70000000]
['Miles Davis' 48000000]
['SIA' 74000000]]
import matplotlib.pyplot as plt
a = np.array([2, 1, 5, 7, 4, 6, 8, 14, 10, 9, 18, 20, 22])
plt.plot(a)