Numpy 多维数据数组的实现

numpy包(模块)几乎总是用于Python中的数值计算。这个软件包为Python提供了高性能的向量、矩阵、张量数据类型。它是在C和Fortran中创建的,因此当计算被矢量化(用矩阵和矢量表示操作)时,性能很高。

1.模块的导入:

%matplotlib inline
import matplotlib.pyplot as plt
from numpy import *

2.数组创建numpy

有几种初始化numpy数组的方法,例如:使用Python的list或tuple。使用旨在创建Numpy数组的函数,如arrange、linspace等。从文件中读取数据(例如Python pickle格式)

2.1根据列表创建numpy.array

v = array([1,2,3,4])
v


v和M 都是ndarray类型的对象,由numpy模块创建。

type(v), type(M)

M.shape

也可以使用numpy方法numpy.shape 和 numpy.size

shape(M)

numpy.ndarray 看起来像一个普通的 Python 列表。使用它们而不是Python列表有几个原因。

Python的列表是非常常见的。它们可以包含任何对象。他们是动态类型化的。它们不支持矩阵和诗词作品等数学运算。由于动态类型的原因,在Python中用list实现这种操作并不是很有效。
Numpy数组是静态类型化和同质化的。元素类型是在创建数组时定义的(那么数组数据类型可以改变)。
Numpy数组不是很耗费内存。
得益于静态类型化,数学函数如乘积和numpy数组的和可以在编译语言中实现(使用C和Fortran)。
使用ndarray数组的dtype(数据类型)属性,我们可以看到数组的数据类型。

M.dtype

创建数组时,可以分别指定数据类型。

M = array([[1, 2], [3, 4]], dtype=complex)
M

x = arange(-1, 1, 0.1)
x

logspace(0, 10, 10, base=e)

#来自于正态分布的随机数
random.randn(5,5)

#偏移对角矩阵
diag([1,2,3], k=1)

ones((3,3))

fig, ax = plt.subplots(figsize=(14,4))
ax.plot(data[:,0]+data[:,1]/12.0+data[:,2]/365, data[:,5])
ax.axis('tight')
ax.set_title('Температура в Стокгольме')
ax.set_xlabel('год')
ax.set_ylabel('температура (C)');

savetxt("random-matrix.csv", M)
savetxt("random-matrix.csv", M, fmt='%.5f') # fmt 指定格式

4.2numpy数组的主要文件格式。

保存和读取的方法numpy.save 和 numpy.load

save("random-matrix.npy", M)
load("random-matrix.npy")

M.nbytes#byte数目
M.ndim#单位数,计数

5.使用数组

5.1编制索引

你可以使用方括号和索引来选择数组的元素。

# v是一个只有一个维度的向量,所以一个索引就足以获得元素。
v[0]

如果我们省略了多维数组中的索引,就会返回一些值(一般情况下,N-1维的数组)。

M

M[1,:]#第一行

使用索引,你可以为单个数组元素赋值。

M[0,0] = 1
M

也适用于行和列

#也适用于行和列
M[1,:] = 0
M[:,2] = -1
M

A[1:3]

我们可以省略M[lower:upper:step]中的部分参数。

A[::]#下限、上限、默认步数

#方阵
A[1:4, 1:4]

5.3先进的索引方法

数组的值可以作为选择项目的索引。

row_indices = [1, 2, 3]
A[row_indices]

你也可以使用掩码:如果掩码类型为bool,那么根据掩码元素的值与相应的索引,选择该元素(True)或不选择(False)。

B = array([n for n in range(5)])
B

row_mask = array([1,0,1,0,0], dtype=bool)
B[row_mask]

mask = (5 < x) * (x < 7.5)
mask

5.4从数组中提取数据和创建数组的函数。

5.4.1where

索引掩码可以通过使用以下方法转换为位置索引 where

indices = where(mask)
indices

5.4.2diag

使用diag函数还可以提取对角线和子对角线元素。

diag(A)

5.4.3take

类似于上述的索引方法。

v2 = arange(-3,3)
v2

v2.take(row_indices)

5.4.4choose

从多个数组中提取数值。

which = [1, 0, 1, 0]
choices = [[-2,-2,-2,-2], [5,5,5,5]]
 
choose(which, choices) # 0th elem of 0 array, 1st elem of 1 array, ...

v1 + 2

A + 2

v1 * v1

A * v1

dot(A, v1)

也可以将数组转换为矩阵的类型。然后再根据矩阵代数的规律进行+、-、*的算术运算。

M = matrix(A)
v = matrix(v1).T#换位
v

M * v

v + M*v

8.1平均值

#温度柱
mean(data[:,3])

8.3sum, prod, и trace

d = arange(0, 10)
d

#所有元素的乘积
prod(d+1)
#累计总和
cumsum(d)

8.4多变量数据

m = random.rand(3,3)
m

#每列最大值 
m.max(axis=0)

9.改变阵列的形状和大小

A

B[0,0:5] = 5
B

B = A.flatten()
B

#A没有改变,因为B是A的副本,不是同一个对象的引用。
A

#向量 -> 单列矩阵
v[:, newaxis]

v[newaxis,:].shape

concatenate((a, b), axis=1)

hstack((a,b))

#B等同于A
B = A 
#改变B,将影响A
B[0,0] = 10
 
B

B = copy(A)
#现在改变B将不再影响A
B[0,0] = -5
B

14.矩阵的循环

v = array([1,2,3,4])
 
for element in v:
  print(element)

通过枚举,可以同时获得元素的值和索引。

for row_idx, row in enumerate(M):
  print("row_idx", row_idx, "row", row)
  
  for col_idx, element in enumerate(row):
    print("col_idx", col_idx, "element", element)
    
    # update the matrix M: square each element
    M[row_idx, col_idx] = element ** 2

到此这篇关于Numpy 多维数据数组的实现的文章就介绍到这了,更多相关Numpy 多维数据数组内容请搜索来客网以前的文章或继续浏览下面的相关文章希望大家以后多多支持来客网!