Numpy简介

Numpy

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

Ndarray

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

问题1:Ndarray与array的区别是什么呢?

答:ndarray是一个对象,而array是一个方法(函数),起作用是生成一个ndarry的对象。

问题2:Ndarray是怎么存储的呢?

Numpy简介

Ndarray具有一下属性:

  • dtype:表示数组的数据类型

  • shape:表示数组的维度,或矩阵的秩

  • strides:暂时不懂·····

创建矩阵

# 方式一
matrix = [
    [1,2,3,4],
    [3,4,5,6],
    [7,8,9,10],
    [11,12,13,14],
]

matrix = np.array[matrix] #成功

# 方式二
matrix = np.arange(start, end, step) #这样只能创建一维矩阵
matrix = np.arange(star, end, step).reshape(层数, 列数, 行数) #可以通过reshape方法改变

#方法三
matrix = np.zeros(shape, *dtype=None, *order='C')
matrix = np.ones(shape, *dtype=None, *order='C')

下面引用知乎@曲奇的例子辅助理解

一、多维数据的形象表示

import numpy as np

# 一维数据不用赘言
data_1d = np.array([0, 1, 2, 3])

# 二维数据作为 m 行 n 列的表格,例如 2 行 3 列
data_2d = np.arange(6).reshape(2, 3)

# 三维数据作为 k 层 m 行 n 列 的积木块, 例如 2 层 3 行 4 列
data_3d = np.arange(24).reshape(2, 3, 4)
Numpy简介

检查一个 ndarray 数据的维度和大小,分别用 ndim 和 shape 属性。

>>> print(data_3d.ndim)
3
>>> print(data_3d.shape)
(2, 3, 4)

shape 是一个很关键的属性,我是这样把它和各个轴对应的:

shape:  (2, 3, 4)
         k, m, n
         z, y, x

心法1: x, y, z 对应的shape元组是从右往左数的。

这是我的个人习惯,也符合主流的用法。

二、图像数据的小误会

打开一幅 640 x 480 的图像:

import numpy as np
import matplotlib.pylab as plt

image = plt.imread("lena.jpg")
print(image.shape)

# --- 结果 ---
#  (480, 640, 3)
#  (y, x, c)

不是 640 x 480 吗, 怎么倒过来了?我写代码的时候在这里总是犯迷糊。

在口头表达中,我们先说宽640,再说高480,而在计算机中是先高(y) 后宽(x),注意了!

每个像素有三个颜色分量(color),所以这个维度放在了最右边,可以理解,顺序就是 (y, x, c)

三、抽象轴上的操作

对于4维及更高维度的数据,无法在3维空间图示。这个时候,就不要考虑形象思维了,直接按照规则做处理。

用 shape 属性返回的元组,从左到右,座标轴分别命名为 axis 0, axis 1, ...,请注意,现在是从左向右数,正好是这个元组的 index,在以后的运算中,都按此规定。

>>> print(data.shape)
(3, 3, 2, 5)

# axis 0:  3
# axis 1:  3
# axis 2:  2
# axis 3:  5

心法2: 抽象座标轴顺序从左向右。指定哪个轴,就只在哪个轴向操作,其他轴不受影响。

  1. 排序(sorting)
data = np.array(np.arange(12))
np.random.shuffle(data)
data = data.reshape(3, 4)
print(data)

#   [[10  8  3  2]
#    [ 5  6  0  7]
#    [11  4  9  1]]

print( np.sort(data, axis=0) )

#   [[ 5  4  0  1]       | 小
#    [10  6  3  2]       | 到
#    [11  8  9  7]]      | 大

print( np.sort(data, axis=1) )
      
#      小  到  大
#      --------->
#   [[ 2  3  8 10]
#    [ 0  5  6  7]
#    [ 1  4  9 11]]

如果你在心中能把抽象轴和 x, y, z 对应起来,则理解轴向排序很容易。

shape:  (3, 4)
axis:    0, 1
AXIS:    y, x
  1. 求和、均值、方差、最大、最小、累加、累乘

这几个函数调用,一般会指定轴向,注意适用 心法2

sum,mean,std,var,min,max 会导致这个轴被压扁,缩减为一个数值,降维打击??

data = np.arange(24).reshape(2, 3, 4)
print(data)

#   [[[ 0  1  2  3]
#     [ 4  5  6  7]
#     [ 8  9 10 11]]
# 
#    [[12 13 14 15]
#     [16 17 18 19]
#     [20 21 22 23]]]

print( np.sum(data, axis=0) )

#   0轴被sum压扁,1轴2轴不变
#   [[12 14 16 18]
#    [20 22 24 26]
#    [28 30 32 34]]

print( np.sum(data, axis=1) )

#   1轴被sum压扁,0轴2轴不变
#   [[12 15 18 21]
#    [48 51 54 57]]

Numpy简介

cumsum,cumprod 不缩减轴向,只在指定轴向操作,请读者自己试验。

  1. 索引和切片(indexing and slicing)

心法3: 在索引中出现冒号(

上一篇:5-Pandas数据处理


下一篇:python-数据处理