Processamento de dados Python (Tutorial introdutório)

criar e gerar

Esta seção apresenta principalmente a criação e geração de arrays. Por que colocar isso no topo? Há duas razões principais:

Em primeiro lugar, no processo de trabalho real, precisamos verificar ou visualizar a API ou interoperabilidade relacionada ao array de tempos em tempos. Ao mesmo tempo, às vezes, ao usar ferramentas como sklearn, matplotlib, PyTorch, Tensorflow, etc., alguns dados simples são necessários para experimentação.

Portanto, há muitos benefícios em aprender como obter rapidamente um array primeiro. Nesta seção, apresentamos principalmente os seguintes métodos comuns de criação:

  • Usar uma lista ou tupla

  • use arange

  • Usar linspace/logspace

  • 使用 uns/zeros

  • usar aleatório

  • ler do arquivo

Entre eles, os mais utilizados são linspace/logspace e random, sendo que o primeiro é frequentemente usado para desenhar eixos de coordenadas, e o segundo é usado para gerar "dados de simulação". Por exemplo, quando precisamos desenhar uma imagem de uma função, X geralmente é gerado usando linspace, então Y é obtido usando a fórmula da função e, em seguida, plotado; quando precisamos construir alguma entrada (como X) ou entrada intermediária ( como Embedding, estado oculto) ), aleatório é muito conveniente.

Criar a partir da lista ou tupla do python

⭐⭐ Concentre-se em dominar a lista de entrada para criar um array:np.array(list)

⚠️ Obs: "Tipo de Dados". Se você for cuidadoso o suficiente, poderá descobrir que o segundo número no segundo conjunto de códigos abaixo é um "decimal" (Nota: 1. == 1.0 em Python) e array é para garantir que cada elemento tenha o mesmo tipo, então ele irá ajudá-lo a colocar o array é convertido em um tipo float.

# 一个 list
np.array([1,2,3])
array([1, 2, 3])
# 二维(多维类似)
# 注意,有一个小数哦
np.array([[1, 2., 3], [4, 5, 6]])
array([[1., 2., 3.],
       [4., 5., 6.]])
# 您也可以指定数据类型
np.array([1, 2, 3], dtype=np.float16)
array([1., 2., 3.], dtype=float16)
# 如果指定了 dtype,输入的值都会被转为对应的类型,而且不会四舍五入
lst = [
    [1, 2, 3],
    [4, 5, 6.8]
]
np.array(lst, dtype=np.int32)
array([[1, 2, 3],
       [4, 5, 6]], dtype=int32)

# 一个 tuple
np.array((1.1, 2.2))
array([1.1, 2.2])
# tuple,一般用 list 就好,不需要使用 tuple
np.array([(1.1, 2.2, 3.3), (4.4, 5.5, 6.6)])
array([[1.1, 2.2, 3.3],
       [4.4, 5.5, 6.6]])
# 转换而不是上面的创建,其实是类似的,无须过于纠结
np.asarray((1,2,3))
array([1, 2, 3])
np.asarray(([1., 2., 3.], (4., 5., 6.)))
array([[1., 2., 3.],
       [4., 5., 6.]])

Gerado usando arange

⭐⭐

range é um gerador de sequência inteiro embutido em Python, e arange é numpy, que tem um efeito semelhante e gera um vetor unidimensional. Ocasionalmente, precisamos usar esse método para construir arrays, como:

  • Necessidade de criar um vetor unidimensional contínuo como entrada (por exemplo, pode ser usado ao codificar a posição)

  • Quando você precisa observar os resultados da triagem e amostragem, as matrizes ordenadas geralmente são mais fáceis de observar

⚠️ De referir que: no  reshape momento, o número de elementos exigido pela forma alvo deve ser igual ao número original de elementos.

np.arange(12).reshape(3, 4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
# 注意,是小数哦
np.arange(12.0).reshape(4, 3)
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.],
       [ 9., 10., 11.]])
np.arange(100, 124, 2).reshape(3, 2, 2
 
 

array([[[100, 102],
[104, 106]],

[[108, 110],
[112, 114]],

[[116, 118],
[120, 122]]])

# shape size 相乘要和生成的元素数量一致
np.arange(100., 124., 2).reshape(2,3,4)
 
 

-------------------------------------------------- -------------------------

ValueError Traceback (última chamada mais recente)

<ipython-input-20-fc850bf3c646> em <module>
---- > 1 np.arange(100., 124., 2).reshape(2,3,4)


ValueError: não é possível remodelar a matriz de tamanho 12 em forma (2,3,4)

Gerado usando linspace/logspace

⭐⭐⭐

OK, esta é a primeira API importante que encontramos. A primeira precisa passar em 3 parâmetros: o início, o fim e o número; a última precisa passar em uma base adicional, que tem como padrão 10.

⚠️ Obs: o terceiro parâmetro não o tamanho do passo.

np.linspace

# 线性
np.linspace(0, 9, 10).reshape(2, 5)
array([[0., 1., 2., 3., 4.],
       [5., 6., 7., 8., 9.]])
np.linspace(0, 9, 6).reshape(2, 3)
array([[0. , 1.8, 3.6],
       [5.4, 7.2, 9. ]])

# 指数 base 默认为 10
np.logspace(0, 9, 6, base=np.e).reshape(2, 3)
array([[1.00000000e+00, 6.04964746e+00, 3.65982344e+01],
       [2.21406416e+02, 1.33943076e+03, 8.10308393e+03]])
# _ 表示上(最近)一个输出
# logspace 结果 log 后就是上面 linspace 的结果
np.log(_)
array([[0. , 1.8, 3.6],
       [5.4, 7.2, 9. ]])

Vamos olhar mais de perto:

N = 20
x = np.arange(N)
y1 = np.linspace(0, 10, N) * 100
y2 = np.logspace(0, 10, N, base=2)

plt.plot(x, y2, '*');
plt.plot(x, y1, 'o');

# 检查每个元素是否为 True
# base 的 指数为 linspace 得到的就是 logspace
np.alltrue(2 ** np.linspace(0, 10, N)  == y2)
True
⚠️ 补充:关于 array 的条件判断
# 不能直接用 if 判断 array 是否符合某个条件
arr = np.array([1, 2, 3])
cond1 = arr > 2
cond1
array([False, False,  True])
if cond1:
    print("这不行")
 
 

-------------------------------------------------- -------------------------

ValueError Traceback (última chamada mais recente)

<ipython-input-184-6bd8dc445309> em <module>
---- > 1 if cond1:
2 print("这不行")


ValueError: O valor de verdade de um array com mais de um elemento é ambíguo. Use a.any() ou a.all()

# 即便你全是 True 它也不行
arr = np.array([1, 2, 3])
cond2 = arr > 0
cond2
array([ True,  True,  True])
if cond2:
    print("这还不行")
 
 

-------------------------------------------------- -------------------------

ValueError Traceback (última chamada mais recente)

<ipython-input-187-7fedc8ba71a0> em <module>
---- > 1 if cond2:
2 print("这还不行")


ValueError: O valor de verdade de um array com mais de um elemento é ambíguo. Use a.any() ou a.all()

# 咱们只能用 any 或 all,这个很容易犯错,请务必注意。
if cond1.any():
    print("只要有一个为True就可以,所以——我可以")
只要有一个为True就可以,所以——我可以
if cond2.all():
    print("所有值为True才可以,我正好这样")
所有值为True才可以,我正好这样

Criado com uns/zeros

Atalho para criar uma matriz de 1/0. Deve-se notar que os  dois podem gerar rapidamente um vetor 0 np.zeros_like ou  np.ones_like1 da mesma forma que a matriz fornecida, que pode ser usada quando certas posições da Máscara são necessárias.

⚠️ Deve-se notar que o array criado é do tipo float por padrão.

np.ones(3)
array([1., 1., 1.])
np.ones((2, 3))
array([[1., 1., 1.],
       [1., 1., 1.]])
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.]]])
# 像给定向量那样的 0 向量(ones_like 是 1 向量)
np.zeros_like(np.ones((2,3,3)))
array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

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

Gerado usando random

⭐⭐⭐⭐⭐

Se você quiser escolher uma das APIs mais importantes desta seção, deve ser  random sem dúvida, aqui apresentamos apenas algumas das APIs mais usadas relacionadas a dados de "produção". Eles são frequentemente usados ​​para geração aleatória de dados de treinamento ou teste, inicialização de rede neural, etc.

⚠️ Deve-se notar que: aqui recomendamos uniformemente o uso do novo método de API para criar, ou seja,  np.random.default_rng() primeiro  Generatorgerando e depois gerando vários dados distribuídos com base nisso (a memória é mais fácil e mais clara). No entanto, ainda vamos apresentar o uso da API antiga, porque muito do código ainda é usado na antiga, você pode misturar.

# 0-1 连续均匀分布
np.random.rand(2, 3)
array([[0.42508994, 0.5842191 , 0.09248675],
       [0.656858  , 0.88171822, 0.81744539]])
# 单个数
np.random.rand()
0.29322641374172986
# 0-1 连续均匀分布
np.random.random((3, 2))
array([[0.17586271, 0.5061715 ],
       [0.14594537, 0.34365713],
       [0.28714656, 0.40508807]])
# 指定上下界的连续均匀分布
np.random.uniform(-1, 1, (2, 3))
array([[ 0.66638982, -0.65327069, -0.21787878],
       [-0.63552782,  0.51072282, -0.14968825]])
# 上面两个的区别是 shape 的输入方式不同,无伤大雅了
# 不过从 1.17 版本后推荐这样使用(以后大家可以用新的方法)
# rng 是个 Generator,可用于生成各种分布
rng = np.random.default_rng(42)
rng
Generator(PCG64) at 0x111B5C5E0
# 推荐的连续均匀分布用法
rng.random((2, 3))
array([[0.77395605, 0.43887844, 0.85859792],
       [0.69736803, 0.09417735, 0.97562235]])
# 可以指定上下界,所以更加推荐这种用法
rng.uniform(0, 1, (2, 3))
array([[0.47673156, 0.59702442, 0.63523558],
       [0.68631534, 0.77560864, 0.05803685]])
# 随机整数(离散均匀分布),不超过给定的值(10)
np.random.randint(10, size=2)
array([6, 3])
# 随机整数(离散均匀分布),指定上下界和 shape
np.random.randint(0, 10, (2, 3))
array([[8, 6, 1],
       [3, 8, 1]])
# 上面推荐的方法,指定大小和上界
rng.integers(10, size=2)
array([9, 7])
# 上面推荐的方法,指定上下界
rng.integers(0, 10, (2, 3))
array([[5, 9, 1],
       [8, 5, 7]])
# 标准正态分布
np.random.randn(2, 4)
array([[-0.61241167, -0.55218849, -0.50470617, -1.35613877],
       [-1.34665975, -0.74064846, -2.5181665 ,  0.66866357]])
# 上面推荐的标准正态分布用法
rng.standard_normal((2, 4))
array([[ 0.09130331,  1.06124845, -0.79376776, -0.7004211 ],
       [ 0.71545457,  1.24926923, -1.22117522,  1.23336317]])
# 高斯分布
np.random.normal(0, 1, (3, 5))
array([[ 0.30037773, -0.17462372,  0.23898533,  1.23235421,  0.90514996],
       [ 0.90269753, -0.5679421 ,  0.8769029 ,  0.81726869, -0.59442623],
       [ 0.31453468, -0.18190156, -2.95932929, -0.07164822, -0.23622439]])
# 上面推荐的高斯分布用法
rng.normal(0, 1, (3, 5))
array([[ 2.20602146, -2.17590933,  0.80605092, -1.75363919,  0.08712213],
       [ 0.33164095,  0.33921626,  0.45251278, -0.03281331, -0.74066207],
       [-0.61835785, -0.56459129,  0.37724436, -0.81295739,  0.12044035]])

Em resumo, duas distribuições são geralmente usadas: distribuição uniforme e distribuição normal (Gaussiana). Além disso, size a forma pode ser especificada.

rng = np.random.default_rng(42)
# 离散均匀分布
rng.integers(low=0, high=10, size=5)
array([0, 7, 6, 4, 4])
# 连续均匀分布
rng.uniform(low=0, high=10, size=5)
array([6.97368029, 0.94177348, 9.75622352, 7.61139702, 7.86064305])
# 正态(高斯)分布
rng.normal(loc=0.0, scale=1.0, size=(2, 3))
array([[-0.01680116, -0.85304393,  0.87939797],
       [ 0.77779194,  0.0660307 ,  1.12724121]])

ler do arquivo

Esta seção é usada principalmente para carregar e implementar parâmetros de peso armazenados ou conjuntos de dados pré-processados, o que às vezes é conveniente, como carregar parâmetros de modelo treinados na memória para fornecer serviços de inferência ou pré-processar dados que levam muito tempo Armazená-los diretamente e não necessidade de reprocessar para vários experimentos.

⚠️ Deve-se notar que: você não precisa escrever o sufixo do nome do arquivo ao armazenar, ele será adicionado automaticamente.

# 直接将给定矩阵存为 a.npy
np.save('./data/a', np.array([[1, 2, 3], [4, 5, 6]]))
# 可以将多个矩阵存在一起,名为 `b.npz`
np.savez("./data/b", a=np.arange(12).reshape(3, 4), b=np.arange(12.).reshape(4, 3))
# 和上一个一样,只是压缩了
np.savez_compressed("./data/c", a=np.arange(12).reshape(3, 4), b=np.arange(12.).reshape(4, 3))
# 加载单个 array
np.load("data/a.npy")
array([[1, 2, 3],
       [4, 5, 6]])
# 加载多个,可以像字典那样取出对应的 array
arr = np.load("data/b.npz")
arr["a"]
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
arr["b"]
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.],
       [ 9., 10., 11.]])
# 后缀都一样,你干脆当它和上面的没区别即可
arr = np.load("data/c.npz")
arr["b"]
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.],
       [ 9., 10., 11.]])

Estatísticas e Propriedades

Nesta seção, começamos com as propriedades estatísticas básicas do array para aprender mais sobre o array recém-criado. Inclui principalmente os seguintes aspectos:

  • Relacionado ao tamanho

  • Máximo, mínimo, médio, quantil

  • Média, Soma, Desvio Padrão, etc.

São todos indicadores relacionados à estatística descritiva, que são muito úteis para entendermos uma matriz como um todo. Dentre eles, o mais utilizado é o relacionado ao tamanho " shape", máximo, mínimo, média, somatório, etc.

O conteúdo desta seção é muito simples, você só precisa prestar atenção especial (lembre-se) a duas características importantes:

  • Encontre o resultado por dimensão (especifique o eixo). Geralmente, 0 significa coluna 1 significa linha, o que pode ser entendido como " operar ao longo de linha/coluna ". Se você não tiver certeza, pode tentar com um exemplo.

  • Manter dimensão após cálculo ( keepdims=True)

Além disso, para conveniência da operação, usamos um array gerado aleatoriamente como objeto da operação; ao mesmo tempo, especificamos a semente, para que a cada execução, todos vejam o mesmo resultado. Geralmente, quando treinamos o modelo, muitas vezes precisamos especificar a semente, para que os parâmetros possam ser ajustados nas "mesmas condições".

#  先创建一个 Generator
rng = np.random.default_rng(seed=42)
#  再生成一个均匀分布
arr = rng.uniform(0, 1, (3, 4))
arr
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.09417735, 0.97562235, 0.7611397 , 0.78606431],
       [0.12811363, 0.45038594, 0.37079802, 0.92676499]])

Relacionado ao tamanho

⭐⭐

Esta seção inclui principalmente: dimensão, forma e volume de dados, de qual forma  shape usamos mais.

⚠️ Deve-se notar que tamanho não é uma forma, e ndim indica que existem várias dimensões.

# 维度,array 是二维的(两个维度)
arr.ndim
2

np.shape

# 形状,返回一个 Tuple
arr.shape
(3, 4)
# 数据量
arr.size
12

Quantil Mais Valioso

⭐⭐⭐

Esta seção inclui principalmente: valor máximo, valor mínimo, mediana e outros quantis, dos quais " valor máximo e valor mínimo " geralmente usamos mais.

⚠️ Deve-se notar que o quantil pode ser qualquer decimal de 0-1 (representando o quantil correspondente), e o quantil não está necessariamente no array original.

arr
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.09417735, 0.97562235, 0.7611397 , 0.78606431],
       [0.12811363, 0.45038594, 0.37079802, 0.92676499]])
# 所有元素中最大的
arr.max()
0.9756223516367559

np.max/min

# 按维度(列)最大值
arr.max(axis=0)
array([0.77395605, 0.97562235, 0.85859792, 0.92676499])
# 同理,按行
arr.max(axis=1)
array([0.85859792, 0.97562235, 0.92676499])
# 是否保持原来的维度
# 这个需要特别注意下,很多深度学习模型中都需要保持原有的维度进行后续计算
# shape 是 (3,1),array 的 shape 是 (3,4),按行,同时保持了行的维度
arr.min(axis=1, keepdims=True)
array([[0.43887844],
       [0.09417735],
       [0.12811363]])
# 保持维度:(1,4),原始array是(3,4)
arr.min(axis=0, keepdims=True)
array([[0.09417735, 0.43887844, 0.37079802, 0.69736803]])
# 一维了
arr.min(axis=0, keepdims=False)
array([0.09417735, 0.43887844, 0.37079802, 0.69736803])

# 另一种用法,不过我们一般习惯使用上面的用法,其实两者一回事
np.amax(arr, axis=0)
array([0.77395605, 0.97562235, 0.85859792, 0.92676499])
# 同 amax
np.amin(arr, axis=1)
array([0.43887844, 0.09417735, 0.12811363])
# 中位数
# 其他用法和 max,min 是一样的
np.median(arr)
0.7292538655248584
# 分位数,按列取1/4数
np.quantile(arr, q=0.25, axis=0)
array([0.11114549, 0.44463219, 0.56596886, 0.74171617])
# 分位数,按行取 3/4,同时保持维度
np.quantile(arr, q=0.75, axis=1, keepdims=True)
array([[0.79511652],
       [0.83345382],
       [0.5694807 ]])
# 分位数,注意,分位数可以是 0-1 之间的任何数字(分位)
# 如果是 1/2 分位,那正好是中位数
np.quantile(arr, q=1/2, axis=1)
array([0.73566204, 0.773602  , 0.41059198])

desvio padrão somado médio

⭐⭐⭐

Esta subseção inclui principalmente: média, soma cumulativa, variância, desvio padrão e outros indicadores estatísticos adicionais. O mais usado deles é "médio".

arr
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.09417735, 0.97562235, 0.7611397 , 0.78606431],
       [0.12811363, 0.45038594, 0.37079802, 0.92676499]])

np.average

# 平均值
np.average(arr)
0.6051555606435642
# 按维度平均(列)
np.average(arr, axis=0)
array([0.33208234, 0.62162891, 0.66351188, 0.80339911])

# 另一个计算平均值的 API
# 它与 average 的主要区别是,np.average 可以指定权重,即可以用于计算加权平均
# 一般建议使用 average,忘掉 mean 吧!
np.mean(arr, axis=0)
array([0.33208234, 0.62162891, 0.66351188, 0.80339911])

np.sum

# 求和,不多说了,类似
np.sum(arr, axis=1)
array([2.76880044, 2.61700371, 1.87606258])
np.sum(arr, axis=1, keepdims=True)
array([[2.76880044],
       [2.61700371],
       [1.87606258]])

# 按列累计求和
np.cumsum(arr, axis=0)
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.8681334 , 1.41450079, 1.61973762, 1.48343233],
       [0.99624703, 1.86488673, 1.99053565, 2.41019732]])
# 按行累计求和
np.cumsum(arr, axis=1)
array([[0.77395605, 1.21283449, 2.07143241, 2.76880044],
       [0.09417735, 1.0697997 , 1.8309394 , 2.61700371],
       [0.12811363, 0.57849957, 0.94929759, 1.87606258]])
# 标准差,用法类似
np.std(arr)
0.28783096517727075
# 按列求标准差
np.std(arr, axis=0)
array([0.3127589 , 0.25035525, 0.21076935, 0.09444968])
# 方差
np.var(arr, axis=1)
array([0.02464271, 0.1114405 , 0.0839356 ])

 

Acho que você gosta

Origin blog.csdn.net/BYGFJ/article/details/123677005
Recomendado
Clasificación