python之numpy绝对基础

什么是numpy

NumPy 是 Python 科学计算的基础包。它是一个 Python 库,提供了一个多维数组对象、各种派生对象(例如掩码数组和矩阵),以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。

NumPy 包的核心是ndarray对象

为什么要用它

NumPy 数组比 Python 列表更快、更紧凑。数组占用内存少,使用方便。NumPy 使用更少的内存来存储数据,它提供了一种指定数据类型的机制。这允许进一步优化代码

axis(轴的理解)

轴数(有几层就有几个轴)

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]##与上面做对比是不是改变了呢

  1. concatenate合并两个数组,
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
  1. 数组的形状和大小
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.最后一个值是每个小数组的值得个数,我发现每个小数组的个数都要相等(猜测)

总结,从前往后显示的是,从外层到最里层每层的元素个数。

  1. 重塑数组
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 - 否则类似订单。(这是一个可选
参数,不需要指定。)
  1. 低维数组转为高一维维
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轴就是把最前面两个数交换的位置,(我也搞不懂)

  1. 可以选择规定的数
    是在所有数据中选择
 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[])返回的是值
还符合||,&&,*,<等逻辑运算符

  1. 堆叠

垂直堆叠(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]]
  1. 加减乘除
    对应位置加减乘除
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的和
不写就是所有的和
  1. 最小最大
b=np.array([[2,3,4],[1,3,4]])
print(b.min()) 1
print(b.max()) 4
  1. 索引与切片

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]
  1. 去重
    不传参数把所有数组展平再算
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]]
  1. 转置
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]]
  1. 翻转数组
    注意和大小无关,只和位置有关
    一维
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]))
指定某一个数组反转
  1. 展平
    使用 时flatten,对新数组的更改不会更改父数组。
    但是当您使用 时ravel,您对新数组所做的更改将影响父数组。
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]
  1. 访问文档字符串以获取更多信息
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.
  1. 保存和加载 NumPy 对象
    规则:该ndarray对象可以被保存并从与磁盘文件,load而save函数处理NumPy的二进制文件与.npy文件扩展名,一个savez功能与手柄NumPy的文件.npz文件扩展名。
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)

你可能感兴趣的:(numpy基础,数组,python,机器学习,numpy)