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

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

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

type(v), type(M)

v数组和M数组的区别在于它们的尺寸(形式)。我们可以使用ndarray.shape属性来获取大小信息。

v.shape

M.shape

矩阵中元素的数量可以通过属性ndarray.size

M.size

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

shape(M)

size(M)

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

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

M.dtype

试图分配一个错误类型(不一样的类型)的值会导致错误。

M[0,0] = "hello"

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

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

通常使用以下dtype值:int、float、complex、bool、object等。

我们也可以用比特来指定大小:int64、int16、float128、complex128。

3.使用函数生成数组

使用python列表来指定大型数组是不切实际的。你可以使用各种Numpy方法。

3.1arrange

x = arange(0, 10, 1) # arguments: start, stop, step
x

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

3.2linspace 和 logspace

使用linspace,区间的两端都被包括在内,参数:(开始,停止,点的数量)

linspace(0, 10, 25)

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

3.3mgrid

x, y = mgrid[0:5, 0:5]
x
y

3.4随机数

#导入所需模块
from numpy import random
#区间[0,1]内的均匀分布数。
random.rand(5,5)

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

3.6diag

#对角矩阵
diag([1,2,3])

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

3.5零和单位矩阵

zeros((3,3))

ones((3,3))

4.文件导入和导出

4.1逗号分隔的值(CSV)

一个非常常见的数据存储格式是CSV,以及类似的格式,如TSV(制表分隔值)。要从这些文件中读取数据,你可以使用以下方法numpy.genfromtxt

data = genfromtxt('stockholm_td_adj.dat')
data.shape

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)');

使用numpy.savetxt我们可以将数组保存在CSV中。

M = random.rand(3,3)
M

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")

4.3numpy数组的其他属性

M.itemsize#每个byte中的单元数
M.nbytes#byte数目
M.ndim#单位数,计数

5.使用数组

5.1编制索引

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

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

# M是一个矩阵(二维数组),所以需要两个索引(行,列)。
M[1,1]

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

M

M[1]

M[1,:]#第一行

M[:,1]#第一列

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

M[0,0] = 1
M

也适用于行和列

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

5.2选择数组的一部分

你可以使用M[lower:uperior:step]语法来获取一个数组的一部分。

A = array([1,2,3,4,5])
A

A[1:3]

数组的部分是可变的:如果给它们分配新的值,那么从它们提取的数组就会改变原来的数组。

A[1:3] = [-2,-3]
A

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

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

低于零的指数从数组的末端开始计算。

A = array([1,2,3,4,5])
A[-1]#最后一个元素
A[-3:]#最后三个元素

索引分区也适用于多维数组。

A = array([[n+m*10 for n in range(5)] for m in range(5)])
A

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

#渐进,带有指定间隔数
A[::2, ::2]

5.3先进的索引方法

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

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

col_indices = [1, 2, -1]
A[row_indices, col_indices]

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

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

row_mask = array([True, False, True, False, False])
B[row_mask]

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

这个函数对于根据某些条件从数组中选择元素非常有用。

x = arange(0, 10, 0.5)
x

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

x[mask]

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

5.4.1where

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

indices = where(mask)
indices

x[indices]#这个索引相当于x[mask]的索引。

5.4.2diag

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

diag(A)

diag(A,-1)

5.4.3take

类似于上述的索引方法。

v2 = arange(-3,3)
v2

row_indices = [1, 3, 5]
v2[row_indices]

v2.take(row_indices)

但take也可以在列表和其他对象上工作。

take([-3, -2, -1, 0, 1, 2], 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, ...

6.线性代数

6.1点积运算

v1 = arange(0, 5)
v1 * 2

v1 + 2

A * 2

A + 2

6.2基础运算

A * A

v1 * v1

A.shape, v1.shape

A * v1

7.矩阵

7.1矩阵

dot(A, A)

dot(A, v1)

dot(v1, v1)

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

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

M * M

M * v

v.T * v

v + M*v

8.数据处理

shape(data)

8.1平均值

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

过去200年,斯德哥尔摩的平均气温在6.2摄氏度左右。

8.2标准差和离散度

std(data[:,3]), var(data[:,3])

8.3sum, prod, и trace

d = arange(0, 10)
d

#求和
sum(d)

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

#累积乘积
cumprod(d+1)
#和diag(A).sum()一样
trace(A)

8.4多变量数据

m = random.rand(3,3)
m

m.max()

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

#每行最大值
m.max(axis=1)

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

A

n, m = A.shape
B = A.reshape((1,n*m))
B

B[0,0:5] = 5
B

A 

B = A.flatten()
B

B[0:5] = 10
B

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

10.增加一个新的度量newaxis

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

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

#尺寸
v[:,newaxis].shape

v[newaxis,:].shape

11.联合

b = array([[5, 6]])
a = array([[5, 6]])
concatenate((a, b), axis=0)

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

12.hstack and vstack

vstack((a,b))

hstack((a,b))

13.Copy и "deep copy"

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

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

B

A

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

A

14.矩阵的循环

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

for element in v:
  print(element)

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

for row in M:
  print("row", row)

  for element in row:
    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

#每个元素现在都是列表
M

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

(0)

相关推荐

  • numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)

    numpy库对多维数组有非常灵巧的处理方式,主要的处理方法有: .reshape(shape) : 不改变数组元素,返回一个shape形状的数组,原数组不变 .resize(shape) : 与.reshape()功能一致,但修改原数组 In [22]: a = np.arange(20) #原数组不变 In [23]: a.reshape([4,5]) Out[23]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14

  • python中numpy的矩阵、多维数组的用法

    1. 引言 最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的.目前为止,觉得就算法仿真研究而言,还是matlab用得特别舒服,可能是比较熟悉的缘故吧.matlab直接集成了很多算法工具箱,函数查询.调用.变量查询等非常方便,或许以后用久了python也会感觉很好用.与python相比,最喜欢的莫过于可以直接选中某段代码执行了,操作方便,python也可以实现,就是感觉不是很方便. 言归正传,做算法要用

  • Python numpy多维数组实现原理详解

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.今天就针对多维数组展开来写博客numpy其一部分功能如下: 1.ndarray,是具有矢量算术运算且节省空间的多维数组. 2.可以用于对整组的数据快速进行运算的辨准数学函数. 3.能够用于读写磁盘数据的工具以及用于操作系统内存映射的工具. NumPy它本身其实没有提供很高级别的数据分析功能,NumPy之于数值计算特别重要的原因之一,就是因为

  • numpy.ndarray 交换多维数组(矩阵)的行/列方法

    如下所示: >> import numpy as np >> P = np.eye(3) >> P array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) 交换第 0 行和第 2 行: >> P[[0, 2], :] = P[[2, 0], :] # P[(0, 2), :] = P[(2, 0), :] >> P array([[ 0., 0., 1.], [ 0., 1., 0.], [ 1.

  • python numpy 一维数组转变为多维数组的实例

    如下所示: import numpy new_list = [i for i in range(9)] numpy.array(new_list).reshape(3,3) 借助numpy库: 以上这篇python numpy 一维数组转变为多维数组的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴

    如下所示: >> type(np.newaxis) NoneType >> np.newaxis == None True np.newaxis 在使用和功能上等价于 None,查看源码发现:newaxis = None,其实就是 None 的一个别名. 1. np.newaxis 的实用 >> x = np.arange(3) >> x array([0, 1, 2]) >> x.shape (3,) >> x[:, np.newa

  • NumPy 如何生成多维数组的方法

    Python现在是最热门的人工智能语言,各种工具的支持如Google的Tensorflow,都是首选支持Python的. 但是,与R语言不同,Python语言设计时,并没有考虑对于矩阵运算,统计计算等功能做专项支持.于是我们需要NumPy库来补足这一能力上的不足. NumPy是Python的著名扩展库,相当于Python中的MATLAB. Numpy 中,ndarray 类具有六个参数,它们分别为: shape:数组的形状. dtype:数据类型. buffer:对象暴露缓冲区接口. offse

  • Numpy 多维数据数组的实现

    numpy包(模块)几乎总是用于Python中的数值计算.这个软件包为Python提供了高性能的向量.矩阵.张量数据类型.它是在C和Fortran中创建的,因此当计算被矢量化(用矩阵和矢量表示操作)时,性能很高. 1.模块的导入: %matplotlib inline import matplotlib.pyplot as plt from numpy import * 2.数组创建numpy 有几种初始化numpy数组的方法,例如:使用Python的list或tuple.使用旨在创建Numpy

  • python中的Numpy二维数组遍历与二维数组切片后遍历效率比较

    在python-numpy使用中,可以用双层 for循环对数组元素进行访问,也可以切片成每一行后进行一维数组的遍历. 代码如下: import numpy as np import time NUM = 160 a=np.random.random((NUM,NUM)) start = time.time() for i in range(NUM):     for j in range(NUM):         if a[i][j] == 1.0:             pass end1

  • Python使用min、max函数查找二维数据矩阵中最小、最大值的方法

    本文实例讲述了Python使用min.max函数查找二维数据矩阵中最小.最大值的方法.分享给大家供大家参考,具体如下: 简单使用min.max函数来得到二维数据矩阵中的最大最小值,很简单,这是因为工作需要用到一个东西所以先简单来写了一下: #!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:找出来随机生成矩阵中的最大.最小值 ''' import time import random def random_matrix_ge

  • numpy和pandas中数组的合并、拉直和重塑实例

    合并 在numpy中合并两个array numpy中可以通过concatenate,参数axis=0表示在垂直方向上合并两个数组,等价于np.vstack:参数axis=1表示在水平方向上合并两个数组,等价于np.hstack. 垂直方向: np.concatenate([arr1,arr2],axis=0) np.vstack([arr1,arr2]) 水平方向: np.concatenate([arr1,arr2],axis=1) np.hstack([arr1,arr2]) import

  • 使用NumPy读取MNIST数据的实现代码示例

    NumPy 什么是NumPy NumPy是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.主页为https://numpy.org/. 安装NumPy 使用pip工具来安装. python -m pip install numpy 使用NumPy读取mnist数据 如果直接从网络上读取mnist数据,恭喜你,目前国内基本需要一个小时以上.所以建议预先下载mnist数据包. 工作环境 当前我的工作环境如下:Win10 + Anaconda

  • PHP以指定字段为索引返回数据库所取的数据数组

    很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码.所以,在完成每个新项目的时 候,适当的做些项目总结.代码总结,或许你会在以后的项目中用得着,极有可能获得意外的收获,比如:代码优化,想到了更好.速度更快的实现方法等等. 牛逼的程序开发者有时候不在于代码量的多少,而是程序的代码简洁性.逻辑复杂但实现的方便性,这些才说明是否是一位好的程序员.我们不做日夜加班到深夜,拼代码量的程序员! 这篇和大家分享几个使用得PHP编程技巧,有些技巧是在看

  • Python的多维空数组赋值方法

    Python里面的list.tuple默认都是一维的. 创建二维数组或者多维数组也是比较简单. 可以这样: list1 = [1,2,] list1.append([3,4,]) 可以这样: list2 = [1,2,[3,4,],] 还可以这样: list3 = [1,2] list3.insert(2, [3,4]) 比较特殊的情况是: list0 = [] list0.append([]) 然后想给二维数组list0的第一个元素赋值.直接写list0[0][0]是会被编译器报错的. 那怎么

  • numpy使用技巧之数组过滤实例代码

    本文研究的主要是numpy使用技巧之数组过滤的相关内容,具体如下. 当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素.使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组(array),不能使用布尔列表(list). >>> x = np.arange(5,0,-1) >>> x array([5, 4, 3, 2, 1]) >>> x[np.array([True, F

  • C++从txt文件中读取二维的数组方法

    此文章用来做笔记, 从MATLAB中保存的二维数组1500*2的数据到txt文件中,格式化保存方式如下: MATLAB代码: fid=fopen('data.txt','wt'); for i=1:1500 fprintf(fid,'%.3f\t%.3f\n',r(i,:)); end fclose(fid); 其中r是1500*2的矩阵 在C++中读取到程序中,使用文件流: #include<iostream> #include<fstream> #include<type

随机推荐