数据分析三剑客之 Numpy 基础教程

在这里插入图片描述


其余两剑客:
🗡 数据分析三剑客之 Pandas 基础教程
🗡 数据分析三剑客之 Matplotlib 基础教程


目录

0.1 先导条件

import numpy as np

1 Ndarray对象(array):

np.array(

    object,    # 数组或嵌套的数列

    dtype = None,   # 数组元素的数据类型,可选

    copy = True,     #  对象是否需要复制,可选

    order = None,    # 	创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)

    subok = False,   # 	默认返回一个与基类类型一致的数组

    ndmin = 0     # 	指定生成数组的最小维度

)

1.1 基础操作:

一维:

np.array([1,2,3])
array([1, 2, 3])

二维:

np.array([[1,2,3],[4,5,6],[7,8,9]])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

指定最小维度:

np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], ndmin=10)
array([[[[[[[[[[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]]]]]]]]]])

指定数据类型:

np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=complex)  # 指定数据类型为复数
array([[1.+0.j, 2.+0.j, 3.+0.j],
       [4.+0.j, 5.+0.j, 6.+0.j],
       [7.+0.j, 8.+0.j, 9.+0.j]])

1.2 与list互相转换:

a = list(range(3))
print(a)
print(type(a))
[0, 1, 2]
<class 'list'>
b=np.array(a)
print(b)
print(type(b))
[0 1 2]
<class 'numpy.ndarray'>
c=b.tolist()
print(c)
print(type(c))
[0, 1, 2]
<class 'list'>

2 数据类型对象(dtype):

np.dtype(

    object,  # 要转换为的数据类型对象

    align,   # 如果为 true,填充字段使其类似 C 的结构体。

    copy    # 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用

)

2.1 常用 NumPy 基本类型:

bool_布尔型数据类型(True 或者 False)
int_默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc与 C 的 int 类型一样,一般是 int32 或 int 64
intp用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8字节(-128 to 127)
int16整数(-32768 to 32767)
int32整数(-2147483648 to 2147483647)
int64整数(-9223372036854775808 to 9223372036854775807)
uint8无符号整数(0 to 255)
uint16无符号整数(0 to 65535)
uint32无符号整数(0 to 4294967295)
uint64无符号整数(0 to 18446744073709551615)
float_float64 类型的简写
float16半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_complex128 类型的简写,即 128 位复数
complex64复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128复数,表示双 64 位浮点数(实数部分和虚数部分)

每个内建类型都有一个唯一定义它的字符代码,如下:

b布尔型
i(有符号) 整型
u无符号整型 integer
f浮点型
c复数浮点型
mtimedelta(时间间隔)
Mdatetime(日期时间)
O(Python) 对象
S,a(byte-)字符串
UUnicode
V原始数据 (void)

2.2 实例:

np.dtype(np.int32)
dtype('int32')
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
np.dtype('i4')
dtype('int32')
np.dtype([('age',np.int8)]) 
dtype([('age', 'i1')])
print("加类型前:")
print(np.array([(10,), (20,), (30,)]))
print("加类型后:")
print(np.array([(10,), (20,), (30,)], dtype=np.dtype([('age', np.int8)])))
print("使用类型字段名读取数据:")
print(np.array([(10,), (20,), (30,)], dtype=np.dtype([('age', np.int8)]))['age'])
加类型前:
[[10]
 [20]
 [30]]
加类型后:
[(10,) (20,) (30,)]
使用类型字段名读取数据:
[10 20 30]
student = np.dtype([('name', 'U20'), ('age', 'i1'), ('score', 'f4')])
print("自定义结构化数据类型:")
print(student)
print("结构化前:")
print(np.array([('张三', 21, 50), ('李四', 18, 75)]))
print("结构化后:")
print(np.array([('张三', 21, 50), ('李四', 18, 75)], dtype=student))
自定义结构化数据类型:
[('name', '<U20'), ('age', 'i1'), ('score', '<f4')]
结构化前:
[['张三' '21' '50']
 ['李四' '18' '75']]
结构化后:
[('张三', 21, 50.) ('李四', 18, 75.)]

3 数组属性:

3.1 秩(ndim):

a = np.array([1, 2, 3, 4, 5])
print("a:")
print(a)
print("a的秩:")
print(a.ndim)
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("b:")
print(b)
print("b的秩:")
print(b.ndim)
a:
[1 2 3 4 5]
a的秩:
1
b:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
b的秩:
2

3.2 形状(shape):

3.2.1 获取数组形状:

a = np.array([1, 2, 3, 4])
print("a:")
print(a)
print("a的形状:")
print(a.shape)
b = np.array([[1, 2, 3], [4, 5, 6]])
print("b:")
print(b)
print("b的形状:")
print(b.shape)
a:
[1 2 3 4]
a的形状:
(4,)
b:
[[1 2 3]
 [4 5 6]]
b的形状:
(2, 3)

3.2.2 修改数组形状:

a = np.array([[1, 2, 3], [4, 5, 6]])
print("修改前:")
print(a)
a.shape = (3, 2)
print("修改后:")
print(a)
修改前:
[[1 2 3]
 [4 5 6]]
修改后:
[[1 2]
 [3 4]
 [5 6]]

3.3 大小(size):

元素总个数

a = np.array([1, 2, 3, 4])
print("a:")
print(a)
print("a的元素总个数:")
print(a.size)
b = np.array([[1, 2, 3], [4, 5, 6]])
print("b:")
print(b)
print("b的元素总个数:")
print(b.size)
a:
[1 2 3 4]
a的元素总个数:
4
b:
[[1 2 3]
 [4 5 6]]
b的元素总个数:
6

3.4 元素类型(dtype):

详见前面 数据类型对象(dtype)

a = np.array([1, '2', 3, 4])
print("a:")
print(a)
print("a的元素类型:")
print(a.dtype)
b = np.array([[1, 2, 'qwer'], [4, 5, 6]])
print("b:")
print(b)
print("b的元素类型:")
print(b.dtype)
a:
['1' '2' '3' '4']
a的元素类型:
<U11
b:
[['1' '2' 'qwer']
 ['4' '5' '6']]
b的元素类型:
<U11

3.5 每个元素的大小(itemsize):

# 数组的 dtype 为 int8(一个字节)
x = np.array([1, 2, 3, 4, 5], dtype=np.int8)
print("x(int8):")
print(x)
print("x的元素大小:")
print(x.itemsize)
# 数组的 dtype 现在为 float64(八个字节)
y = np.array([1, 2, 3, 4, 5], dtype=np.float64)
print("y(float64):")
print(y)
print("y的元素大小:")
print(y.itemsize)
x(int8):
[1 2 3 4 5]
x的元素大小:
1
y(float64):
[1. 2. 3. 4. 5.]
y的元素大小:
8

3.6 内存信息(flags):

包含以下属性:

C_CONTIGUOUS ©数据是在一个单一的C风格的连续段中
F_CONTIGUOUS (F)数据是在一个单一的Fortran风格的连续段中
OWNDATA (O)数组拥有它所使用的内存或从另一个对象中借用它
WRITEABLE (W)数据区域可以被写入,将该值设置为 False,则数据为只读
ALIGNED (A)数据和所有元素都适当地对齐到硬件上
UPDATEIFCOPY (U)这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新
x = np.array([1,2,3,4,5])  
print (x.flags)
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

4 数组构造:

4.1 创建普通数组(array):

np.array(

    object, # 数组。
          公开数组接口的任何对象,__array__方法返回数组的对象,或任何(嵌套)序列。
    dtype=None,  # 数据类型,可选。
              数组所需的数据类型。如果没有给出,那么类型将被确定为保持序列中的对象所需的最小类型。
              此参数只能用于“upcast”数组。对于向下转换,请使用.astype(t)方法。
    copy=True,  #  bool,可选。
              如果为true(默认值),则复制对象。
              否则,只有当__array__返回副本,obj是嵌套序列,
                  或者需要副本来满足任何其他要求(dtype,顺序等)时,才会进行复制。
    order='K',   #   {'K','A','C','F'},可选。
                指定阵列的内存布局。        
    subok=False,  #  bool,可选。
              如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。
    ndmin=0   # int,可选。
                指定结果数组应具有的最小维数。根据需要,将根据需要预先设置形状。

)

一维数组:

np.array([1, 2, 3])
array([1, 2, 3])

二维数组:

np.array(
    [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

三维数组:

np.array(
    [[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
     [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
     [[19, 20, 21], [22, 23, 24], [25, 26, 27]]])
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]],

       [[19, 20, 21],
        [22, 23, 24],
        [25, 26, 27]]])

n维数组~ ~ ~

4.2 创建指定形状和数据类型的数组(empty):

数组中的数取决于数组在内存中的位置处的值.

np.empty(

    shape,  # 数组形状

    dtype = float,  # 数据类型,可选

    order = 'C'  # 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序

)

np.empty((2, 3, 4))
array([[[6.23042070e-307, 1.89146896e-307, 1.37961302e-306,
         6.23053614e-307],
        [6.23053954e-307, 9.34609790e-307, 8.45593934e-307,
         9.34600963e-307],
        [1.86921143e-306, 6.23061763e-307, 6.23060065e-307,
         8.45603441e-307]],

       [[9.79111267e-307, 1.11260144e-306, 1.60219035e-306,
         8.34448533e-308],
        [1.27946076e-307, 1.33511562e-306, 8.90103560e-307,
         1.42410974e-306],
        [1.00132228e-307, 1.33511018e-306, 1.69119330e-306,
         3.46949290e-260]]])

4.3 创建指定形状且值全为0的数组(zeros):

np.zeros(

    shape,  # 数组形状

    dtype = float,  # 数据类型,可选

    order = 'C'  # 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序

)

np.zeros((2, 3, 4))
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]])

4.4 创建指定形状且值全为1的数组(ones):

np.zeros(

    shape,  # 数组形状

    dtype = float,  # 数据类型,可选

    order = 'C'  # 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序

)

np.ones((2, 3, 4))
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

4.5 创建对角矩阵(eye):

np.eye(

    N, # 行数
    
    M, # 列数,默认等于N,即方阵
    
    k = 0,# 对角线的索引:0(默认值)指的是主对角线,正值指的是上对角线,负值指的是下对角线。
    
    dtype = <class’flove’>,# 返回数组的数据类型。
    
    order =‘C’  # 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

)

默认方阵:

np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

对角线向上平移1:

np.eye(3, k=1)
array([[0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.]])

非方阵矩阵:

np.eye(3, 4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.]])

4.6 从已有数组创建数组:

4.6.1 改造已有数组(asarray):

np.asarray(

    a,     #  任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组

    dtype,   #   数据类型

    order   #  可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

)

4.6.1.1np.asarray与np.array的区别:

array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。

当数据源时list对象时二者没有区别

data = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
array1 = np.array(data)
array2 = np.asarray(data)
print("data修改前:")
print("data:")
print(data)
print("array1:")
print(array1)
print("array2:")
print(array2)
data[0][0] = 100
print("data修改后:")
print("data:")
print(data)
print("array1:")
print(array1)
print("array2:")
print(array2)
data修改前:
data:
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
array1:
[[1 1 1]
 [1 1 1]
 [1 1 1]]
array2:
[[1 1 1]
 [1 1 1]
 [1 1 1]]
data修改后:
data:
[[100, 1, 1], [1, 1, 1], [1, 1, 1]]
array1:
[[1 1 1]
 [1 1 1]
 [1 1 1]]
array2:
[[1 1 1]
 [1 1 1]
 [1 1 1]]

但当数据源为ndarray对象时区别就显现出来了

data = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
array1 = np.asarray(data)
print("data修改前:")
print("data:")
print(data)
print("array1:")
print(array1)
data[0][0] = 100
print("data修改后:")
print("data:")
print(data)
print("array1:")
print(array1)
data修改前:
data:
[[1 1 1]
 [1 1 1]
 [1 1 1]]
array1:
[[1 1 1]
 [1 1 1]
 [1 1 1]]
data修改后:
data:
[[100   1   1]
 [  1   1   1]
 [  1   1   1]]
array1:
[[100   1   1]
 [  1   1   1]
 [  1   1   1]]
4.6.1.2 将元组转化为Ndarray:
np.asarray((1, 2, 3))
array([1, 2, 3])
4.6.1.3 将多维元组转化为Ndarray:
np.asarray(((1, 2, 3), (4, 5, 6), (7, 8, 9)))
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
np.asarray(((1, 2, 3), (4, 5, 6), (8, 9)))
array([(1, 2, 3), (4, 5, 6), (8, 9)], dtype=object)
4.6.1.4 将列表转化为Ndarray:
np.asarray([1, 2, 3])
array([1, 2, 3])
4.6.1.5 将多维列表转化为Ndarray:
np.asarray([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
array = np.asarray([[1, 2, 3], [4, 5, 6], [8, 9]])
print(array)
[list([1, 2, 3]) list([4, 5, 6]) list([8, 9])]
4.6.1.6 将列表和元组的混合元组转化为Ndarray:
np.asarray(((1, 2, 3), [4, 5, 6], [7, 8, 9]))
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
array = np.asarray(((1, 2, 3), [4, 5, 6], [8, 9]))
print(array)
[(1, 2, 3) list([4, 5, 6]) list([8, 9])]
4.6.1.7 将列表和元组的混合列表转化为Ndarray:
np.asarray([(1, 2, 3), [4, 5, 6], [7, 8, 9]])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
np.asarray([(1, 2, 3), [4, 5, 6], [8, 9]])
array([(1, 2, 3), list([4, 5, 6]), list([8, 9])], dtype=object)

4.6.2 empty_like:

返回一个和a相同结构和数据类型, 但全部用随机数来填充的数组。

np.empty_like(a, dtype=None, order=‘K’,subok=True)

np.empty_like( np.array([1,2,3]))
array([-279555424,        502,          0])

4.6.3 zeros_like:

返回一个和a相同结构和数据类型,但全部用零填充的数组.

np.zeros_like(a, dtype=None, order=‘K’, subok=True)

np.zeros_like( np.array([1,2,3]))
array([0, 0, 0])

4.6.4 ones_like:

返回一个和a相同结构和数据类型, 但全部用1来填充的数组.

np.ones_like(a, dtype=None, order=‘K’, subok=True)

np.ones_like( np.array([1,2,3]))
array([1, 1, 1])

4.7 可迭代对象的数组转化(fromiter):

该函数从可迭代对象中建立ndarray对象,返回一维数组。

np.fromiter(

    iterable,  #  可迭代对象
    
    dtype,  # 返回数组的数据类型
    
    count=-1  # 读取的数据数量,默认为-1,读取所有数据

)

np.fromiter(iter(range(5)), dtype=int)
array([0, 1, 2, 3, 4])
np.fromiter(iter("1234"), dtype=int)
array([1, 2, 3, 4])

4.8 流转化(frombuffer):

np.frombuffer(

    buffer,  #  可以是任意对象,会以流的形式读入。

    dtype = float,  #  返回数组的数据类型,可选

    count = -1,  #  读取的数据数量,默认为-1,读取所有数据。

    offset = 0  #  读取的起始位置,默认为0。

)

# buffer是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。
np.frombuffer(b"1234", dtype="S1")
array([b'1', b'2', b'3', b'4'], dtype='|S1')
np.frombuffer(b"1234", dtype="S2")
array([b'12', b'34'], dtype='|S2')

4.9 从数值范围创建数组:

4.9.1 等差数列:

4.9.1.1 指定步长方式创建(arange):(指定公差)

np.arange(

    start, # 	起始值,默认为0

    stop, # 	终止值(不包含)

    step,  # 	步长,默认为1

    dtype  # 	返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

)

np.arange(1, 11)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

指定步长:

np.arange(1, 11, step=3)
array([ 1,  4,  7, 10])
4.9.1.2 指定数组元素个数创建(linspace):(指定数列长度)

np.linspace(

    start,  #  	序列的起始值

    stop,   # 	序列的终止值,如果endpoint为true,该值包含于数列中

    num=50,  # 	要生成的等步长的样本数量(数组元素个数),默认为50

    endpoint=True,  # 	该值为 true 时,数列中中包含stop值,反之不包含,默认是True。

    retstep=False,  # 	如果为 True 时,生成的数组中会显示间距,反之不显示。

    dtype=None  # 	ndarray 的数据类型

)

np.linspace(1, 10)
array([ 1.        ,  1.18367347,  1.36734694,  1.55102041,  1.73469388,
        1.91836735,  2.10204082,  2.28571429,  2.46938776,  2.65306122,
        2.83673469,  3.02040816,  3.20408163,  3.3877551 ,  3.57142857,
        3.75510204,  3.93877551,  4.12244898,  4.30612245,  4.48979592,
        4.67346939,  4.85714286,  5.04081633,  5.2244898 ,  5.40816327,
        5.59183673,  5.7755102 ,  5.95918367,  6.14285714,  6.32653061,
        6.51020408,  6.69387755,  6.87755102,  7.06122449,  7.24489796,
        7.42857143,  7.6122449 ,  7.79591837,  7.97959184,  8.16326531,
        8.34693878,  8.53061224,  8.71428571,  8.89795918,  9.08163265,
        9.26530612,  9.44897959,  9.63265306,  9.81632653, 10.        ])

指定数组元素个数:

np.linspace(1, 10, 5)
array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ])

4.9.2 等比数列(logspace):

np.logspace(

    start,  # 	序列的起始值

    stop,  # 	序列的终止值

    num=50,  # 要生成的等步长的样本数量,默认为50

    endpoint=True,  # 该值为 true 时,数列中中包含stop值,反之不包含,默认是True。

    base=10.0, # 对数 log 的底数。

    dtype=None #  数据类型

)

np.logspace(0, 9, num=10)
array([1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07,
       1.e+08, 1.e+09])
np.logspace(0, 9, num=10, dtype=int, base=2)  # 指定公比
array([  1,   2,   4,   8,  16,  32,  64, 128, 256, 512])

4.10 构造复杂数组:

4.10.1 数组的重复(tile):

np.tile(

    a,  #  要扩充的实体array_like
    
    reps  #  如果只是单独的一个数字,默认横向展开
          如果是两个数字组成的元组,则按先行后列展开

)

a = np.arange(3)
print("原始数组:")
print(a)
print("一维:")
x = np.tile(a, 2)
print(x)
print("二维:")
x = np.tile(a, (2, 3))
print(x)
原始数组:
[0 1 2]
一维:
[0 1 2 0 1 2]
二维:
[[0 1 2 0 1 2 0 1 2]
 [0 1 2 0 1 2 0 1 2]]

4.10.2 数组元素的重复(repeat):

np.repeat(

    a,  #  要扩充的实体array_like
    
    repeats, # 复制次数
    
    axis=None  # 默认为None,若为多为数组,则将其展开为一维数组元素重复
            axis=0,沿着y轴复制,实际上增加了行数
            axis=1,沿着x轴复制,实际上增加了列数

)

b = np.arange(3)
print("原始数组:")
print(b)
print("第一种方法:")
print(b.repeat(2))
print("第二种方法:")
x = np.repeat(b, 2)
x
print(x)
原始数组:
[0 1 2]
第一种方法:
[0 0 1 1 2 2]
第二种方法:
[0 0 1 1 2 2]
c=np.array(
    [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]])
print("原始数组:")
print(c)
print("一维展开:")
print(np.repeat(c,2))
print("增加行数:")
print(np.repeat(c,2,axis=0))
print("增加列数:")
print(np.repeat(c,2,axis=1))
原始数组:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
一维展开:
[1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9]
增加行数:
[[1 2 3]
 [1 2 3]
 [4 5 6]
 [4 5 6]
 [7 8 9]
 [7 8 9]]
增加列数:
[[1 1 2 2 3 3]
 [4 4 5 5 6 6]
 [7 7 8 8 9 9]]

4.10.3 一维数组网格化(meshgrid):

X,Y = np.meshgrid(x, y)

x,y,是网格点的横纵坐标列向量(非矩阵)

X,Y,是坐标矩阵

a = np.arange(3)
b = np.arange(2)
print("a:")
print(a)
print("b:")
print(b)
grid_a, grid_b = np.meshgrid(a, b)
print("grid_a:")
print(grid_a)
print("grid_b:")
print(grid_b)
a:
[0 1 2]
b:
[0 1]
grid_a:
[[0 1 2]
 [0 1 2]]
grid_b:
[[0 0 0]
 [1 1 1]]

如果觉得看不明白的话,可以这样理解:

grid_a:[[0 1 2][0 1 2]]

grid_b:[[0 0 0][1 1 1]]

上下结合,就将a、b这两个一维数组网格化了,网格上的点即为(0,0)(1,0)(2,0)(0,1)(1,1)(2,1)
~ ~

4.10.4 指定范围和分割方式的网格化(mgrid):

np.mgrid[

start:开始坐标

stop:结束坐标(实数不包括,复数包括)

step步长

]

np.mgrid[1:11:1]
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
grid_1,grid_2=np.mgrid[0:3:1,0:2:1]
print(grid_1)
print(grid_2)
[[0 0]
 [1 1]
 [2 2]]
[[0 1]
 [0 1]
 [0 1]]

对比和meshgrid的区别:

grid_1:[[0 0][1 1][2 2]]

grid_2:[[0 1][0 1][0 1]]

(0,0)(0,1)(1,0)(1,1)(2,0)(2,1)

5 数组操作:

5.1 改变数组形状:

np.reshape(

    a, # array_like 要重塑的数组。

    newshape, # int或int的元组。新形状应与原始形状兼容。
            如果是整数,则结果将是该长度的一维数组。
            一种形状尺寸可以为-1。在这种情况下,该值是根据数组的长度和其余维来推断的。
    order ='C' #  {'C','F','A'},可选
            使用此索引顺序读取a的元素,并使用此索引顺序将元素放入重新排列的数组中。
            “ C”表示使用类似C的索引顺序读取/写入元素,最后一个轴索引更改最快,回到第一个轴索引更改最慢。
            “ F”表示使用类似Fortran的索引顺序读取/写入元素,第一个索引更改最快,最后一个索引更改最慢。
            请注意,“ C”和“ F”选项不考虑基础数组的内存布局,仅指索引的顺序。
            如果a在内存中是连续的,则以类似于Fortran的索引顺序读取/写入元素,否则为类似于C的顺序。

)

5.1.1 改变数组形状(reshape):

a = np.arange(1, 7)
a
array([1, 2, 3, 4, 5, 6])

一种方法:

b = np.reshape(a, (3, 2))
b
array([[1, 2],
       [3, 4],
       [5, 6]])

另一种方法:

np.arange(1, 7).reshape((3, 2))
array([[1, 2],
       [3, 4],
       [5, 6]])

当reshape形状不符合要求时会报错:

np.arange(1, 7).reshape((9, 9))
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-242-a2d3661a8a3f> in <module>
----> 1 np.arange(1, 7).reshape((9, 9))


ValueError: cannot reshape array of size 6 into shape (9,9)

5.1.2 改变数组形状(resize):

a=np.arange(1, 7)
a
array([1, 2, 3, 4, 5, 6])
b=np.resize(a,(3,2))
b
array([[1, 2],
       [3, 4],
       [5, 6]])

当resize形状不符合时会自动填充:

np.resize(np.arange(1, 7), (9, 9))
array([[1, 2, 3, 4, 5, 6, 1, 2, 3],
       [4, 5, 6, 1, 2, 3, 4, 5, 6],
       [1, 2, 3, 4, 5, 6, 1, 2, 3],
       [4, 5, 6, 1, 2, 3, 4, 5, 6],
       [1, 2, 3, 4, 5, 6, 1, 2, 3],
       [4, 5, 6, 1, 2, 3, 4, 5, 6],
       [1, 2, 3, 4, 5, 6, 1, 2, 3],
       [4, 5, 6, 1, 2, 3, 4, 5, 6],
       [1, 2, 3, 4, 5, 6, 1, 2, 3]])

5.1.3 改变轴的顺序(rollaxis):

np.rollaxis(

    a,  # 数组

    axis,  # 要改变的轴。其他轴的相对顺序保持不变

    start=0  # 要改变的轴滚动至此位置之前。默认值为0

)

a = np.arange(8).reshape(2, 2, 2)
print('原数组:')
print(a)
print('将轴 2 滚动到轴 0:(宽度到深度):')
print(np.rollaxis(a, 2))
print('将轴 0 滚动到轴 1:(宽度到高度):')
print(np.rollaxis(a, 2, 1))
原数组:
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
将轴 2 滚动到轴 0:(宽度到深度):
[[[0 2]
  [4 6]]

 [[1 3]
  [5 7]]]
将轴 0 滚动到轴 1:(宽度到高度):
[[[0 2]
  [1 3]]

 [[4 6]
  [5 7]]]

5.1.4 数组降维:(n维降至一维)

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
a.reshape(-1)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

另一种方法:

a.ravel()
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

5.1.5 行列转换:(类似于矩转置)

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
a.transpose() 
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])

5.2 广播(Broadcast):

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

5.2.1 当二者形状相同时:

a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
c = a * b
print(c)
[ 10  40  90 160]

5.2.2 当二者形状不同时,自动触发广播机制:

a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([1, 2, 3])
print(a + b)
[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]

5.3 切片和索引:

5.3.1 一维数组:

与list一样

a = np.arange(1, 11)
print(a[:])
print(a[::-1])
print(a[3:7])
print(a[3:7:2])
[ 1  2  3  4  5  6  7  8  9 10]
[10  9  8  7  6  5  4  3  2  1]
[4 5 6 7]
[4 6]

5.3.2 二维数组:

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print("原始数组:")
print(a)
print("获取某一行:")
print("法一:")
print(a[1])      # 第2行
print("法二:")
print (a[1,...])   # 第2行元素
print("获取多行:")
print(a[1:3])    # 后两行
print("获取某一列:")
print (a[...,1])   # 第2列元素
print("获取多列:")
print (a[...,1:])  # 第2列及剩下的所有元素
原始数组:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
获取某一行:
法一:
[4 5 6]
法二:
[4 5 6]
获取多行:
[[4 5 6]
 [7 8 9]]
获取某一列:
[2 5 8]
获取多列:
[[2 3]
 [5 6]
 [8 9]]

5.4 获取某个位置的元素:

x = np.array([[1,  2],  [3,  4],  [5,  6]])
print("原始数组:")
print(x)
y = x[[0, 1, 2],
      [0, 1, 0]]  # 竖着看(0,0)(1,1)(2,0)
print("获取谋某些位置的数值:")
print(y)
原始数组:
[[1 2]
 [3 4]
 [5 6]]
获取谋某些位置的数值:
[1 4 5]

5.5 布尔索引:

我们可以通过一个布尔数组来索引目标数组。

布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

5.5.1 范围取值:

x = np.array([[0,  1,  2], [3,  4,  5], [6,  7,  8], [9,  10,  11]])
print("原始数组:")
print(x)
print('布尔索引筛选:')
print(x[x > 5])
原始数组:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
布尔索引筛选:
[ 6  7  8  9 10 11]

5.5.2 过滤(~):

a = np.array([np.nan,  1, 2, np.nan, 3, 4, 5])
print("原始数组:")
print(a)
print("过滤后:")
print(a[~np.isnan(a)])
原始数组:
[nan  1.  2. nan  3.  4.  5.]
过滤后:
[1. 2. 3. 4. 5.]

5.6 花式索引:

花式索引指的是利用整数数组进行索引。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

5.6.1 正序索引:

x = np.arange(32).reshape((8, 4))
print("原始数组:")
print(x)
print("新数组:")
print(x[[4, 2, 1, 7]])
原始数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
新数组:
[[16 17 18 19]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [28 29 30 31]]

5.6.2 倒序索引:

x = np.arange(32).reshape((8, 4))
print("原始数组:")
print(x)
print("新数组:")
print(x[[-4, -2, -1, -7]])
原始数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
新数组:
[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4  5  6  7]]

5.6.3 传入多个索引数组(ix_):

x = np.arange(32).reshape((8, 4))
print("原始数组:")
print(x)
print("新数组:")
print(x[np.ix_([1, 5, 7, 2],
               [0, 3, 1, 2])])  # 每行按照 0 3 1 2 来排序
原始数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
新数组:
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]

5.7 数组复制:

5.7.1 浅复制(view):(共享内存)

a = np.array([1, 2])
a
array([1, 2])
b = a.view()
b
array([1, 2])
b is a
False
b.base is a
True
b.flags.owndata
False

5.7.2 深复制(copy):(独享内存)

a = np.array([1, 2])
a
array([1, 2])
c = a.copy()
c
array([1, 2])
c is a
False
c.base is a
False
c.flags.owndata
True

5.8 数组合并:

5.8.1 append:

np.append(

    arr,  # 需要被添加values的数组
    
    values, # 添加到数组arr中的值(array_like,类数组)
    
    axis=None # 可选参数,如果axis没有给出,那么arr,values都将先展平成一维数组。
            注:如果axis被指定了,那么arr和values需要有相同的shape,
            否则报错:ValueError: arrays must have same number of dimensions

)

a=np.array([1,2])
a
array([1, 2])

添加一个元素:

np.append(a, 3)
array([1, 2, 3])

添加一个ndarray:

np.append(a, np.array([3, 4, 5, 6, 7]))
array([1, 2, 3, 4, 5, 6, 7])

水平合并:

np.append(np.array([[1, 2, 3]]), np.array([[4, 5, 6]]),axis=1)
array([[1, 2, 3, 4, 5, 6]])

竖直合并:

np.append(np.array([[1, 2, 3]]), np.array([[4, 5, 6]]),axis=0)
array([[1, 2, 3],
       [4, 5, 6]])

5.8.2 concatenate:

np.concatenate(

    (a1, a2, ...), # 传入的参数必须是一个多个数组的元组或者列表

    axis=0

)

a = np.array([[1, 2], [3, 4]])
a
array([[1, 2],
       [3, 4]])
b1 = np.array([5, 6])  # 一维数组
b1
array([5, 6])
np.concatenate((a,b1)) # 维数不一样会报错
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-279-70ebb45ced05> in <module>
----> 1 np.concatenate((a,b1)) # 维数不一样会报错


<__array_function__ internals> in concatenate(*args, **kwargs)


ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)
b2 = np.array([[5, 6]])  # 二维数组
b2
array([[5, 6]])
np.concatenate((a,b2),axis=0) # 纵向拼接
array([[1, 2],
       [3, 4],
       [5, 6]])
b3 = np.array([[5], [6]])
b3
array([[5],
       [6]])
np.concatenate((a, b3), axis=1)  # 横向拼接
array([[1, 2, 5],
       [3, 4, 6]])
np.concatenate((a, b3), axis=None)  # 拼接并展开为一维数组
array([1, 2, 3, 4, 5, 6])

5.8.3 stack:

np.stack(

    arrays, # array_like

    axis=0

)

a = np.arange(60).reshape(3, 4, 5)
b = np.arange(60).reshape(3, 4, 5)
a.shape, b.shape
((3, 4, 5), (3, 4, 5))
np.stack((a, b), axis=0).shape
(2, 3, 4, 5)
np.stack((a,b), axis=1).shape
(3, 2, 4, 5)
np.stack((a,b), axis=2).shape
(3, 4, 2, 5)
np.stack((a,b), axis=3).shape
(3, 4, 5, 2)

可见,axis等于几,就相当于把第几维的数据向前提升一个维度

5.8.4 hstack、vstack、dstack:

a = np.arange(9).reshape(3, 3)
a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
b = np.arange(9, 18).reshape(3, 3)
b
array([[ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]])
np.hstack((a, b))
array([[ 0,  1,  2,  9, 10, 11],
       [ 3,  4,  5, 12, 13, 14],
       [ 6,  7,  8, 15, 16, 17]])
np.vstack((a, b))
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]])
np.dstack((a, b))
array([[[ 0,  9],
        [ 1, 10],
        [ 2, 11]],

       [[ 3, 12],
        [ 4, 13],
        [ 5, 14]],

       [[ 6, 15],
        [ 7, 16],
        [ 8, 17]]])

5.9 数组拆分:

5.9.1 split:

np.split(

    ary,  # 要切分的数组 

    indices_or_sections, # 如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)

    axis=0 # 沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分

)

5.9.1.1 一维数组:
a = np.array([1, 2, 3, 4])
a
array([1, 2, 3, 4])
np.split(a, 2)
[array([1, 2]), array([3, 4])]

如果数组长度不能整除要分割的数量就会报错:

np.split(a, 3)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

C:\Anaconda\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)
    864     try:
--> 865         len(indices_or_sections)
    866     except TypeError:


TypeError: object of type 'int' has no len()


During handling of the above exception, another exception occurred:


ValueError                                Traceback (most recent call last)

<ipython-input-297-9595497857d7> in <module>
----> 1 np.split(a, 3)


<__array_function__ internals> in split(*args, **kwargs)


C:\Anaconda\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)
    869         if N % sections:
    870             raise ValueError(
--> 871                 'array split does not result in an equal division')
    872     return array_split(ary, indices_or_sections, axis)
    873 


ValueError: array split does not result in an equal division
5.9.1.2 二维数组:
a = np.arange(1, 17).reshape(4, 4)
a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

纵向切割:

np.split(a, 2, axis=1)
[array([[ 1,  2],
        [ 5,  6],
        [ 9, 10],
        [13, 14]]), array([[ 3,  4],
        [ 7,  8],
        [11, 12],
        [15, 16]])]

横向切割:

np.split(a, 4, axis=0)
[array([[1, 2, 3, 4]]),
 array([[5, 6, 7, 8]]),
 array([[ 9, 10, 11, 12]]),
 array([[13, 14, 15, 16]])]

同样不能整除会报错:

np.split(a, 3, axis=0)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

C:\Anaconda\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)
    864     try:
--> 865         len(indices_or_sections)
    866     except TypeError:


TypeError: object of type 'int' has no len()


During handling of the above exception, another exception occurred:


ValueError                                Traceback (most recent call last)

<ipython-input-301-4ed6c4ac42f0> in <module>
----> 1 np.split(a, 3, axis=0)


<__array_function__ internals> in split(*args, **kwargs)


C:\Anaconda\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)
    869         if N % sections:
    870             raise ValueError(
--> 871                 'array split does not result in an equal division')
    872     return array_split(ary, indices_or_sections, axis)
    873 


ValueError: array split does not result in an equal division

5.9.2 array_split:

split不能进行不均等分割,但它可以

5.9.2.1 一维数组:
a = np.array([1, 2, 3, 4, 5, 6])
a
array([1, 2, 3, 4, 5, 6])
np.array_split(a,5)
[array([1, 2]), array([3]), array([4]), array([5]), array([6])]
5.9.2.2 二维数组:
a = np.arange(1, 17).reshape(4, 4)
a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

纵向切割:

np.array_split(a, 3, axis=1)
[array([[ 1,  2],
        [ 5,  6],
        [ 9, 10],
        [13, 14]]), array([[ 3],
        [ 7],
        [11],
        [15]]), array([[ 4],
        [ 8],
        [12],
        [16]])]

横向切割:

np.array_split(a, 3, axis=0)
[array([[1, 2, 3, 4],
        [5, 6, 7, 8]]), array([[ 9, 10, 11, 12]]), array([[13, 14, 15, 16]])]

5.9.3 hsplit、vsplit、dsplit:

a = np.arange(4).reshape(2, 2)
a
array([[0, 1],
       [2, 3]])
x, y = np.hsplit(a, 2)                        # 水平拆分,返回list
print(x)
print()
print(y)
[[0]
 [2]]

[[1]
 [3]]
x, y = np.vsplit(a, 2)                        # 垂直拆分,返回list
print(x)
print()
print(y)
[[0 1]]

[[2 3]]
b = np.arange(8).reshape(2,2,2)
b
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])
x, y = np.dsplit(b, 2)                        # 深度拆分,返回list
print(x)
print()
print(y)
[[[0]
  [2]]

 [[4]
  [6]]]

[[[1]
  [3]]

 [[5]
  [7]]]

5.10 数组排序:

5.10.1 sort:

np.sort(

    a, # 要排序的数组

    axis=-1, # 沿着它排序数组的轴,如果没有,数组会被展开,沿着最后的轴排序
    
    kind='quicksort',  # 排序方法,默认为’quicksort’(快速排序),
                其他选项还有 ‘mergesort’(归并排序)和 ‘heapsort’(堆排序)
    order=None # 如果数组包含字段,则是要排序的字段

)

a = np.array([3,  1,  2])
a
array([3, 1, 2])
np.sort(a)
array([1, 2, 3])
dt = np.dtype([('name',  'S10'), ('age',  int)])
b = np.array([("raju", 21), ("anil", 25),
              ("ravi",  17),  ("amar", 27)], dtype=dt)
b
array([(b'raju', 21), (b'anil', 25), (b'ravi', 17), (b'amar', 27)],
      dtype=[('name', 'S10'), ('age', '<i4')])
np.sort(b, order="name")
array([(b'amar', 27), (b'anil', 25), (b'raju', 21), (b'ravi', 17)],
      dtype=[('name', 'S10'), ('age', '<i4')])
np.sort(b, order="age")
array([(b'ravi', 17), (b'raju', 21), (b'anil', 25), (b'amar', 27)],
      dtype=[('name', 'S10'), ('age', '<i4')])

5.10.2 argsort:

对值排序返回索引数组,参数同上

a = np.array([3,  1,  2])
np.argsort(a)
array([1, 2, 0], dtype=int64)

5.11 数组查找:

a = np.array([4, 6, 2, 9, 1, 5, 3, 9, 6, 0, 1])
a
array([4, 6, 2, 9, 1, 5, 3, 9, 6, 0, 1])

5.11.1 返回数组中最大值和最小值的索引(argmax/argmin):

np.argmax(a, axis=None, out=None)
3
np.argmin(a, axis=None, out=None)
9

5.11.2 返回数组中非零元素的索引(nonzero):

np.nonzero(a)
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8, 10], dtype=int64),)

5.11.3 返回数组中满足给定条件的索引(where):

np.where(a > 5)
(array([1, 3, 7, 8], dtype=int64),)

5.11.4 返回数组中满足给定条件的元素(extract):

np.extract(a > 5, a)
array([6, 9, 9, 6])

5.12 数组增减元素(insert/delete):

append也可以,见上面 数组合并-append

5.12.1 插入元素(insert):

np.insert(

    arr,  # 一个数组,可以是一维的也可以是多维的,在arr的基础上插入元素

    obj,  # 元素插入的位置

    values, # 需要插入的数值

    axis=None # 指示在哪一个轴上对应的插入位置进行插入

)

a = np.array([[1, 1], [2, 2], [3, 3]])
a
array([[1, 1],
       [2, 2],
       [3, 3]])

默认平铺插入:

np.insert(a, 1, 5)
array([1, 5, 1, 2, 2, 3, 3])

插入行(若为一个值则插入的时相同小数组):

np.insert(a, 1, 5, axis=0)
array([[1, 1],
       [5, 5],
       [2, 2],
       [3, 3]])

插入行(插入一个小数组):

np.insert(a, 1, [5,7], axis=0)
array([[1, 1],
       [5, 7],
       [2, 2],
       [3, 3]])

插入列:

np.insert(a, 1, 5, axis=1)
array([[1, 5, 1],
       [2, 5, 2],
       [3, 5, 3]])

5.12.2 删除元素(delete):

np.delete(

    arr,  # 需要处理的矩阵 

    obj,  # 在什么位置处理 

    axis=None # # 指示在哪一个轴上对应的插入位置进行插入

)

a = np.array([[1, 2], [3, 4], [5, 6]])
a
array([[1, 2],
       [3, 4],
       [5, 6]])

默认平铺删除:

np.delete(a, 1)
array([1, 3, 4, 5, 6])

删除一行:

np.delete(a, 1, axis=0)
array([[1, 2],
       [5, 6]])

删除一列:

np.delete(a, 1, axis=1)
array([[1],
       [3],
       [5]])

5.13 数组去重(unique):

np.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)

5.13.1 x = np.unique(a)

对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表

a = np.array([3, 6, 2, 9, 6, 8, 3, 4, 2, 1, 0])
a
array([3, 6, 2, 9, 6, 8, 3, 4, 2, 1, 0])
x=np.unique(a)
print(x)
[0 1 2 3 4 6 8 9]

5.13.2 x, y = np.unique(b,return_index=True)

return_index=True表示返回新列表元素在旧列表中的位置,并以列表形式储存在y中。

b = np.array([3, 6, 2, 9, 6, 8, 3, 4, 2, 1, 0])
b
array([3, 6, 2, 9, 6, 8, 3, 4, 2, 1, 0])
x, y = np.unique(b, return_index=True)
print(x)
print(y)
[0 1 2 3 4 6 8 9]
[10  9  2  0  7  1  5  3]

5.13.3 x, y, z = np.unique(c, return_index=True, return_inverse=True)

return_inverse=True 表示返回旧列表元素在新列表中的位置,并以列表形式储存在z中

c = np.array([3, 6, 2, 9, 6, 8, 3, 4, 2, 1, 0])
c
array([3, 6, 2, 9, 6, 8, 3, 4, 2, 1, 0])
x, y, z = np.unique(c, return_index=True, return_inverse=True)
print(x)
print(y)
print(z)
[0 1 2 3 4 6 8 9]
[10  9  2  0  7  1  5  3]
[3 5 2 7 5 6 3 4 2 1 0]

5.14 数组迭代(nditer):

np.nditer(

    a, # 数组

    order,  # 'F'列序优先;'C'行序优先

)

a = np.arange(6).reshape(2, 3)
a
array([[0, 1, 2],
       [3, 4, 5]])

默认行序优先:

for x in np.nditer(a):
    print(x, end=" ")
0 1 2 3 4 5 

列序优先:

for x in np.nditer(a,order='F'):
    print(x, end=" ")
0 3 1 4 2 5 

6 位运算:

6.1 获取一个数字的二进制(bin_repr):

np.binary_repr(19, width = 8)
'00010011'
bin(19)
'0b10011'

6.2 按位与(bitwise_and):

np.bitwise_and(17, 13)
1
17 & 13
1

6.3 按位或(bitwise_or):

np.bitwise_or(13,16)
29
13 | 16
29

6.4 按位异或(bitwise_xor):

np.bitwise_xor(10,16)
26
10 ^ 16
26

6.5 按位取反(invert):

np.invert(13)
-14
~13
-14

6.6 二进制左移(left_shift):

np.left_shift(10, 2) # 将10左移两位
40
10 << 2
40

6.7 二进制右移(right_shift):

np.right_shift(10, 2) # 将10右移两位
2
10 >> 2 
2

7 字符串操作(char):

7.1 连接(add):

np.char.add("qwer", "1234")
array('qwer1234', dtype='<U8')
np.char.add(["qwer"], ["1234"])
array(['qwer1234'], dtype='<U8')
np.char.add(np.array(["1", "2", "3"]), 
            np.array(["4", "5", "6"]))
array(['14', '25', '36'], dtype='<U2')

7.2 复制拼接(multiply):

np.char.multiply('qwer ', 3)
array('qwer qwer qwer ', dtype='<U15')
np.char.multiply(["qwer"], 3)
array(['qwerqwerqwer'], dtype='<U12')
np.char.multiply(np.array(["1", "2", "3"]), 3)
array(['111', '222', '333'], dtype='<U3')

7.3 居中并对两侧填充(center):

np.char.center('qwer',
               width=20,  # 总宽度
               fillchar='*'  # 填充字符
               )
array('********qwer********', dtype='<U20')
np.char.center(['qwer'], width=20,  fillchar='*')
array(['********qwer********'], dtype='<U20')

7.4 将字符串的第一个字母转换为大写(capitalize):

np.char.capitalize('qwer')
array('Qwer', dtype='<U4')
np.char.capitalize(['qwer'])
array(['Qwer'], dtype='<U4')

7.5 将字符串的每个单词的第一个字母转换为大写(title):

np.char.title('i love you')
array('I Love You', dtype='<U10')
np.char.title(['i love you'])
array(['I Love You'], dtype='<U10')

7.6 将字符串的每个字母转换为小写(lower):

对每个元素调用 str.lower

np.char.lower('QWER')
array('qwer', dtype='<U4')
np.char.lower(['QWER'])
array(['qwer'], dtype='<U4')

7.7 将字符串的每个字母转换为大写(upper):

对每个元素调用 str.upper

np.char.upper('qwer')
array('QWER', dtype='<U4')
np.char.upper(['qwer'])
array(['QWER'], dtype='<U4')

7.8 分割字符串(split):

通过指定分隔符对字符串进行分割,并返回数组。默认情况下,分隔符为空格

np.char.split('q w e r')
array(list(['q', 'w', 'e', 'r']), dtype=object)
np.char.split(['q w e r'])
array([list(['q', 'w', 'e', 'r'])], dtype=object)
np.char.split('q_w_e_r', sep='_')
array(list(['q', 'w', 'e', 'r']), dtype=object)

7.9 换行符分割字符串(splitlines):

np.char.splitlines('i\nlove\nyou')
array(list(['i', 'love', 'you']), dtype=object)
np.char.splitlines(['i\nlove\nyou'])
array([list(['i', 'love', 'you'])], dtype=object)

\r也可以:

np.char.splitlines('i\rlove\ryou')
array(list(['i', 'love', 'you']), dtype=object)

7.10 首尾清理(strip):

np.char.strip('abcd abcda','a')
array('bcd abcd', dtype='<U10')
np.char.strip(['abcda', 'aaaabcda'], 'a')
array(['bcd', 'bcd'], dtype='<U8')

7.11 指定分隔符来连接数组中的元素或字符串(join):

np.char.join(':','qwer')
array('q:w:e:r', dtype='<U7')
np.char.join([':','-'],['abcd','qwer'])
array(['a:b:c:d', 'q-w-e-r'], dtype='<U7')

7.12 替换(replace):

np.char.replace('aaabbbcccdddeeefff', 'a', 'A')
array('AAAbbbcccdddeeefff', dtype='<U18')

7.13 编码(encode):

np.char.encode('qwer', 'cp500')
array(b'\x98\xa6\x85\x99', dtype='|S4')

7.14 解码(decode):

np.char.decode(np.char.encode('qwer', 'cp500'), 'cp500')
array('qwer', dtype='<U4')

8 数学函数:

8.1 自然数(e):

np.e
2.718281828459045

8.2 π \pi π

np.pi
3.141592653589793

8.3 三角函数:

a = np.array([0, 30, 45, 60, 90])
print('正弦:')
print(np.sin(a*np.pi/180))
print('反正弦:')
print(np.arcsin(np.sin(a*np.pi/180)))
print('角度制:')
print(np.degrees(np.arcsin(np.sin(a*np.pi/180))))
print('余弦:')
print(np.cos(a*np.pi/180))
print('反余弦:')
print(np.arccos(np.cos(a*np.pi/180)))
print('角度制:')
print(np.degrees(np.arccos(np.cos(a*np.pi/180))))
print('正切函数:')
print(np.tan(a*np.pi/180))
print('反正切:')
print(np.arctan(np.tan(a*np.pi/180)))
print('角度制:')
print(np.degrees(np.arctan(np.tan(a*np.pi/180))))
正弦:
[0.         0.5        0.70710678 0.8660254  1.        ]
反正弦:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]
角度制:
[ 0. 30. 45. 60. 90.]
余弦:
[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
 6.12323400e-17]
反余弦:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]
角度制:
[ 0. 30. 45. 60. 90.]
正切函数:
[0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00
 1.63312394e+16]
反正切:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]
角度制:
[ 0. 30. 45. 60. 90.]

8.4 向下取整(floor):

np.floor(3.9999999)
3.0
np.floor([1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9])
array([1., 2., 3., 4., 5., 6., 7., 8., 9.])

8.5 向上取整(ceil):

np.ceil(3.000000001)
4.0
np.ceil([1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9])
array([ 2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

9 算数函数:

9.1 加(add):

np.add(1, 2)
3
1+2
3

9.2 减(subtract):

np.subtract(3,2)
1
3-2
1

9.3 乘(multiply):

np.multiply(3,2)
6
3*2
6

9.4 除(divide):

np.divide(9,3)
3.0
9/3
3.0

9.5 倒数(reciprocal):

np.reciprocal(0.001)
1000.0
np.reciprocal(np.array([0.25,  1.33,  1,  100]))
array([4.       , 0.7518797, 1.       , 0.01     ])

9.6 幂(power):

np.power(2,3)
8
2**3
8
np.power(np.array([0.25,  1.33,  1,  100]), 3)
array([1.562500e-02, 2.352637e+00, 1.000000e+00, 1.000000e+06])

9.7 余数(mod):

np.mod(11,3)
2
np.mod(np.array([0.25,  1.33,  1,  100]), 3)
array([0.25, 1.33, 1.  , 1.  ])

10 统计函数:

10.1 最小/大值(amin/amax):

a = np.array([[3, 7, 5], [8, 4, 3], [2, 4, 9]])
print('原始数组:')
print(a)
print('获取最小值:')
print(np.amin(a))
print('获取每一行的最小值:')
print(np.amin(a, 1))
print('获取每一列的最小值:')
print(np.amin(a, 0))
print('获取最大值:')
print(np.amax(a))
print('获取每一行的最大值:')
print(np.amax(a, 0))
print('获取每一列的最大值:')
print(np.amax(a, axis=0))
原始数组:
[[3 7 5]
 [8 4 3]
 [2 4 9]]
获取最小值:
2
获取每一行的最小值:
[3 3 2]
获取每一列的最小值:
[2 4 3]
获取最大值:
9
获取每一行的最大值:
[8 7 9]
获取每一列的最大值:
[8 7 9]

10.2 最小值最大值之差(ptp):

a = np.array([[3, 7, 5], [8, 4, 3], [2, 4, 9]])
print('原始数组:')
print(a)
print('最小值最大值之差:')
print(np.ptp(a))
print('每一行的最小值最大值之差:')
print(np.ptp(a, axis=1))
print('每一列的最小值最大值之差:')
print(np.ptp(a, axis=0))
原始数组:
[[3 7 5]
 [8 4 3]
 [2 4 9]]
最小值最大值之差:
7
每一行的最小值最大值之差:
[4 5 7]
每一列的最小值最大值之差:
[6 3 6]

10.3 百分位数(percentile):

np.percentile(

    a, # 输入数组
    
    q,  # 要计算的百分位数,在 0 ~ 100 之间
    
    axis # 沿着它计算百分位数的轴

)

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print ('原始数组:')
print (a)
print ('获取50%位置的树数:')
print (np.percentile(a, 50)) 
print ('获取每一列50%位置的树数:')
print (np.percentile(a, 50, axis=0)) 
print ('获取每一行50%位置的树数:')
print (np.percentile(a, 50, axis=1)) 
print("保持维度不变")
print (np.percentile(a, 50, axis=1, keepdims=True))
原始数组:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
获取50%位置的树数:
5.0
获取每一列50%位置的树数:
[4. 5. 6.]
获取每一行50%位置的树数:
[2. 5. 8.]
保持维度不变
[[2.]
 [5.]
 [8.]]

10.4 中位数(median):

a = np.array([[30,65,70],[80,95,10],[50,90,60]])  
print ('原始数组:')
print (a)
print ('获取中位数:')
print (np.median(a))
print ('获取每一列的中位数:')
print (np.median(a, axis =  0))
print ('获取每一行的中位数:')
print (np.median(a, axis =  1))
原始数组:
[[30 65 70]
 [80 95 10]
 [50 90 60]]
获取中位数:
65.0
获取每一列的中位数:
[50. 90. 60.]
获取每一行的中位数:
[65. 80. 60.]

10.5 算术平均值(mean):

a = np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])
print('原始数组:')
print(a)
print('平均值:')
print(np.mean(a))
print('每一列的平均值:')
print(np.mean(a, axis=0))
print('每一行的平均值:')
print(np.mean(a, axis=1))
原始数组:
[[1 2 3]
 [3 4 5]
 [4 5 6]]
平均值:
3.6666666666666665
每一列的平均值:
[2.66666667 3.66666667 4.66666667]
每一行的平均值:
[2. 4. 5.]

10.6 加权平均(average):

比如:

数组[1,2,3,4],相应的权重[4,3,2,1]

加权平均值 = (1 * 4 + 2 * 3 + 3 * 2 + 4 * 1) / ( 4 + 3 + 2 + 1 )

a = np.array([1, 2, 3, 4])
print('原始数组:')
print(a)
print('不指定权重:')
print(np.average(a))# 不指定权重时相当于 mean 函数
wts = np.array([4, 3, 2, 1])
print('指定权重:')
print(np.average(a, weights=wts))# 如果 returned 参数设为 true,则返回权重的和
print('权重的和:')
print(np.average([1, 2, 3,  4], weights=[4, 3, 2, 1], returned=True))
原始数组:
[1 2 3 4]
不指定权重:
2.5
指定权重:
2.0
权重的和:
(2.0, 10.0)

10.7 方差(var):

np.var([1, 2, 3, 4])
1.25

10.8 标准差(std):

np.std([1, 2, 3, 4])
1.118033988749895

11 矩阵(matlib):(Matrix)

前提import numpy.matlib

import numpy.matlib 

11.1 创建一个全为随机值的新矩阵(empty):

np.matlib.empty(

    shape,  # 定义新矩阵形状的整数或整数元组

    dtype,  # 数据类型

    order  # C(行序优先) 或者 F(列序优先)

)

np.matlib.empty((2,2))
matrix([[2.25, 0.25],
        [0.25, 2.25]])

11.2 创建一个以 0 填充的矩阵(zeros):

np.matlib.zeros((2,2))
matrix([[0., 0.],
        [0., 0.]])

11.3 创建一个以 1 填充的矩阵(ones):

np.matlib.ones((2,2))
matrix([[1., 1.],
        [1., 1.]])

11.4 创建一个对角线元素为 1,其他位置为零的矩阵(eye):

np.matlib.eye(

    n, # 矩阵的行数
    
    M, # 矩阵的列数,默认为 n
    
    k,  # 对角线的索引
    
    dtype # 数据类型

)

np.matlib.eye(n =  3, M =  4, k =  0, dtype =  float)
matrix([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.]])

11.5 创建给定大小的单位矩阵(identity):

np.matlib.identity(5, dtype =  float)
matrix([[1., 0., 0., 0., 0.],
        [0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 1.]])

11.6 创建一个数据是随机填充的给定大小的矩阵(rand):

np.matlib.rand(3,3)
matrix([[0.2103638 , 0.19701695, 0.25662278],
        [0.91461242, 0.53698155, 0.08962696],
        [0.24858045, 0.66935183, 0.11712148]])

11.7 二维ndarray对象与矩阵的互换:

i = np.matrix('1,2;3,4')
i
matrix([[1, 2],
        [3, 4]])
j = np.asarray(i)
j
array([[1, 2],
       [3, 4]])
k = np.asmatrix(j)
k
matrix([[1, 2],
        [3, 4]])

12 线性代数:

12.1 数组乘积(dot):

np.dot(

    a,  # ndarray 数组

    b,  #  ndarray 数组

    out=None # ndarray, 可选,用来保存dot()的计算结果

)

a = np.array([[1, 2], [3, 4]])
b = np.array([[11, 12], [13, 14]])
print("a:")
print(a)
print("b:")
print(b)
print("a × b :")
print(np.dot(a, b))
# [[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]
a:
[[1 2]
 [3 4]]
b:
[[11 12]
 [13 14]]
a × b :
[[37 40]
 [85 92]]

12.2 向量点积(vdot):

如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数是多维数组,它会被展开。

a = np.array([[1, 2], [3, 4]])
b = np.array([[11, 12], [13, 14]])
print("a:")
print(a)
print("b:")
print(b)
print("a × b :")
print(np.vdot(a, b))
# 1*11 + 2*12 + 3*13 + 4*14 = 130
a:
[[1 2]
 [3 4]]
b:
[[11 12]
 [13 14]]
a × b :
130

12.3 向量乘积(inner):

一维数组:

np.inner(np.array([1, 2, 3]), np.array([0, 1, 0]))
# 1*0+2*1+3*0
2

二维数组:

a = np.array([[1, 2], [3, 4]])
print('a:')
print(a)
b = np.array([[11, 12], [13, 14]])
print('b:')
print(b)
print('a × b :')
print(np.inner(a, b))
# 1*11+2*12, 1*13+2*14
# 3*11+4*12, 3*13+4*14
a:
[[1 2]
 [3 4]]
b:
[[11 12]
 [13 14]]
a × b :
[[35 41]
 [81 95]]

12.4 矩阵乘积(matmul):

np.matmul 函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。

另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

二维 × 二维:(就是矩阵乘法)

a = [[1,0],[0,1]] 
print("a:")
print(a)
b = [[4,1],[2,2]] 
print("b:")
print(b)
print("a × b :")
print (np.matmul(a,b))
a:
[[1, 0], [0, 1]]
b:
[[4, 1], [2, 2]]
a × b :
[[4 1]
 [2 2]]

有一方为一维:

a = [[1, 0], [0, 1]]
print("a:")
print(a)
b = [1, 2]
print("b:")
print(b)
print("a × b :")
print(np.matmul(a, b))
print("b × a :")
print(np.matmul(b, a))
a:
[[1, 0], [0, 1]]
b:
[1, 2]
a × b :
[1 2]
b × a :
[1 2]

维度大于二:

a = np.arange(8).reshape(2, 2, 2)
print("a:")
print(a)
b = np.arange(4).reshape(2, 2)
print("b:")
print(b)
print("a × b :")
print(np.matmul(a, b))
a:
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
b:
[[0 1]
 [2 3]]
a × b :
[[[ 2  3]
  [ 6 11]]

 [[10 19]
  [14 27]]]

12.5 行列式(det):

a = np.array([[1, 2], [3, 4]])
print("a:")
print(a)
print("det(a):")
print(np.linalg.det(a))
print("det(a):(验证)")
print(1*4-2*3)
b = np.array([[6, 1, 1], [4, -2, 5], [2, 8, 7]])
print("b:")
print(b)
print("det(b):")
print(np.linalg.det(b))
print("det(b):(验证)")
print(6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2))
a:
[[1 2]
 [3 4]]
det(a):
-2.0000000000000004
det(a):(验证)
-2
b:
[[ 6  1  1]
 [ 4 -2  5]
 [ 2  8  7]]
det(b):
-306.0
det(b):(验证)
-306

12.6 矩阵除法(solve):

a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) 
print("a:")
print(a)
b = np.array([[6],[-4],[27]]) 
print("b:")
print (b)
print("a ÷ b :")
x = np.linalg.solve(a,b) 
print (x)
a:
[[ 1  1  1]
 [ 0  2  5]
 [ 2  5 -1]]
b:
[[ 6]
 [-4]
 [27]]
a ÷ b :
[[ 5.]
 [ 3.]
 [-2.]]

12.7 检查结果是否正确(allclose):

np.allclose(np.dot(a, x), b)
True

12.8 矩阵求逆(inv):

a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) 
print("a:")
print(a)
print("a的逆:")
print(np.linalg.inv(a))
a:
[[ 1  1  1]
 [ 0  2  5]
 [ 2  5 -1]]
a的逆:
[[ 1.28571429 -0.28571429 -0.14285714]
 [-0.47619048  0.14285714  0.23809524]
 [ 0.19047619  0.14285714 -0.0952381 ]]

12.9 实例:

有这样一个线性方程组:

x + y + z = 6

2y + 5z = -4

2x + 5y - z = 27

矩阵表示:

111x6
025×y=-4
25-1z27
A×X=B
a = np.array([[1, 1, 1], [0, 2, 5], [2, 5, -1]])
print('A:')
print(a)
ainv = np.linalg.inv(a)
print('B:')
b = np.array([[6], [-4], [27]])
print(b)
print('X:')
x = np.linalg.solve(a, b)
print(x)
A:
[[ 1  1  1]
 [ 0  2  5]
 [ 2  5 -1]]
B:
[[ 6]
 [-4]
 [27]]
X:
[[ 5.]
 [ 3.]
 [-2.]]

13 文件操作:

Numpy 可以读写磁盘上的文本数据或二进制数据。

NumPy 为 ndarray 对象引入了一个简单的文件格式:.npy

.npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。

13.1 写入.npy文件(save):

np.save(

    file,  # 要保存的文件,扩展名为 .npy,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上。

    arr,  # 要保存的数组

    allow_pickle=True,  # 可选,布尔值,允许使用 Python pickles 保存对象数组,
                 Python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。

    fix_imports=True  # 可选,为了方便 Pyhton2 中读取 Python3 保存的数据。

)

a = np.array([1, 2, 3, 4, 5])
# 保存到 outfile.npy 文件上
np.save('outfile.npy', a)
# 保存到 outfile2.npy 文件上,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上
np.save('outfile2', a)

常规方式打开是乱码:

因为它们是 Numpy 专用的二进制格式后的数据

with open ("outfile.npy","r")as f1,open ("outfile2.npy","r")as f2:
    print(f1.read())
    print(f2.read())    
揘UMPYv{'descr': '<i4', 'fortran_order': False, 'shape': (5,), }                                                            

揘UMPYv{'descr': '<i4', 'fortran_order': False, 'shape': (5,), }                                                            

13.2 读取.npy文件(load):

f1 = np.load('outfile.npy')  
f2 = np.load('outfile2.npy')  
print (f1)
print (f2)
[1 2 3 4 5]
[1 2 3 4 5]

13.3 保存多个数组到一个二进制的.npz文件中(savez):(打包不压缩)

其实就是多个前面np.save的保存的npy,再通过打包(未压缩)的方式把这些文件归到一个文件上

np.savez(

	file,  # 文件名/文件路径
	
	*args, # 要存储的数组,可以写多个,如果没有给数组指定Key,Numpy将默认从'arr_0','arr_1'的方式命名
	
	**kwds

)

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.arange(0, 1.0, 0.1)
c = np.sin(b)
# c 使用了关键字参数 sin_array
np.savez("npztest.npz", a, b, sin_array=c)
a
array([[1, 2, 3],
       [4, 5, 6]])
b
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
c
array([0.        , 0.09983342, 0.19866933, 0.29552021, 0.38941834,
       0.47942554, 0.56464247, 0.64421769, 0.71735609, 0.78332691])
r = np.load("npztest.npz")
print(r.files)  # 查看各个数组名称
['sin_array', 'arr_0', 'arr_1']
print(r["arr_0"])  # a
[[1 2 3]
 [4 5 6]]
print(r["arr_1"])  # b
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
print(r["sin_array"])  # c
[0.         0.09983342 0.19866933 0.29552021 0.38941834 0.47942554
 0.56464247 0.64421769 0.71735609 0.78332691]

13.4 保存多个数组到一个二进制的.npz文件中(numpy.savez_compressed):(打包压缩)

这个就是在前面numpy.savez的基础上加了压缩,前面我介绍时尤其注明numpy.savez是得到的文件打包,不压缩的.这个文件就是对文件进行打包时使用了压缩,可以理解为压缩前各npy的文件大小不变,使用该函数比前面的numpy.savez得到的npz文件更小.


注:函数所需参数和numpy.savez一致,用法完成一样.

13.5 以简单的文本文件格式存储数据(savetext):

np.savetxt(

    fname, # 文件名

    X, # 1D或2D array_like ,要保存到文本文件的数据。

    fmt ='%。18e', #  str或strs序列,可选

    delimiter ='', # 分隔符

    newline ='n', # 换行符

    header ='', # 在文件开头写入字符串。

    footer ='', # 写在文件末尾的字符串

    comments ='#', # 将附加到header和footer字符串的字符串,以将其标记为注释。默认值:'#',

    encoding = None  # 用于编码输出文件的编码。不适用于输出流。

)

a = np.array([1, 2, 3, 4, 5])
np.savetxt('out.txt', a)

在这里插入图片描述

13.6 读取文本格式数据(loadtext):

np.loadtxt(

    fname,      # 被读取的文件名

    dtype,      # 指定读取后数据的数据类型

    comments='#',    # 跳过文件中指定参数开头的行(即不读取)

    delimiter=None,    # 指定读取文件中数据的分割符

    converters=None,    # 对读取的数据进行预处理

    skiprows=0,     # 选择跳过的行数

    usecols=None,   # 指定需要读取的列

    unpack=False,   # 选择是否将数据进行向量输出

    encoding      # 对读取的文件进行预编码

)

b = np.loadtxt('out.txt')
print(b)
[1. 2. 3. 4. 5.]
  • 18
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值