NumPy速查

目录

1. ndarry属性

2. 创建数组

3. 从已有的数组创建数组

4. NumPy从数值范围创建数组

5.  NumPy切片和索引

6. NumPy高级索引

7. 广播操作

8. 数组操作

9. NumPy数学运算

10. NumPy IO

11. NumPy Matplotlib

12. NumPy.array

13. ndarray与tensor的相互转换

 


1. ndarry属性

ndarray.ndim秩,即轴的数量或维度的数量
ndarray.shape数组的维度,对于矩阵,n 行 m 列
ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtypendarray 对象的元素类型
ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位
ndarray.flagsndarray 对象的内存信息
ndarray.realndarray元素的实部
ndarray.imagndarray 元素的虚部
ndarray.data

包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

2. 创建数组

# np.zeros
# 默认为浮点数
x = np.zeros(5) 
print(x)
 
# 设置类型为整数
y = np.zeros((5,), dtype = np.int) 
print(y)
 
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print(z)

# np.ones
# 默认为浮点数
x = np.ones(5) 
print(x)
 
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)

3. 从已有的数组创建数组

numpy.asarray
numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
numpy.asarray(a, dtype = None, order = None)
参数说明:
a
任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
dtype
数据类型,可选
order
可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

实例:

将列表转换为 ndarray:
x =  [1,2,3] 
a = np.asarray(x)  
print (a)
输出结果为:
[1  2  3]

将元组转换为 ndarray:
x =  (1,2,3) 
a = np.asarray(x)  
print (a)
输出结果为:
[1  2  3]

将元组列表转换为 ndarray:
x =  [(1,2,3),(4,5)] 
a = np.asarray(x)  
print (a)
输出结果为:
[(1, 2, 3) (4, 5)]

设置了 dtype 参数:
x =  [1,2,3] 
a = np.asarray(x, dtype =  float)  
print (a)
输出结果为:
[ 1.  2.  3.]

4. NumPy从数值范围创建数组

numpy.arange
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)
根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。
参数说明:
start
起始值,默认为0
stop
终止值(不包含)
step
步长,默认为1
dtype
返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
实例

生成 0 到 5 的数组:
x = np.arange(5)  
print (x)
输出结果如下:
[0  1  2  3  4]
设置返回类型位 float:
# 设置了 dtype
x = np.arange(5, dtype =  float)  
print (x)
输出结果如下:
[0.  1.  2.  3.  4.]
设置了起始值、终止值及步长:
x = np.arange(10,20,2)  
print (x)
输出结果如下:
[10  12  14  16  18]

numpy.linspace
numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数说明:
start
序列的起始值
stop
序列的终止值,如果endpoint为true,该值包含于数列中
num
要生成的等步长的样本数量,默认为50
endpoint
该值为 ture 时,数列中中包含stop值,反之不包含,默认是True。
retstep
如果为 True 时,生成的数组中会显示间距,反之不显示。 
dtype
ndarray 的数据类型
以下实例用到三个参数,设置起始点为 1 ,终止点为 10,数列个数为 10。
a = np.linspace(1,10,10)
print(a)
输出结果为:
[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
设置元素全部是1的等差数列:
a = np.linspace(1,1,10)
print(a)
输出结果为:
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
将 endpoint 设为 false,不包含终止值:
a = np.linspace(10, 20,  5, endpoint =  False)  
print(a)
输出结果为:
[10. 12. 14. 16. 18.]
如果将 endpoint 设为 true,则会包含 20。
以下实例设置间距。
a =np.linspace(1,10,10,retstep= True) 
print(a)
# 拓展例子
b =np.linspace(1,10,10).reshape([10,1])
print(b)
输出结果为:
(array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]), 1.0)
[[ 1.]
 [ 2.]
 [ 3.]
 [ 4.]
 [ 5.]
 [ 6.]
 [ 7.]
 [ 8.]
 [ 9.]
 [10.]]

5.  NumPy切片和索引

NumPy 切片和索引 
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

a = np.arange(10)
s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])
输出结果为:
[2  4  6]
以上实例中,我们首先通过 arange() 函数创建 ndarray 对象。 然后,分别设置起始,终止和步长的参数为 2,7 和 2。 
我们也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作:
a = np.arange(10)  
b = a[2:7:2]   # 从索引 2 开始到索引 7 停止,间隔为 2
print(b)
输出结果为:
[2  4  6]
冒号 : 的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。

切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
实例
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素
print (a[...,1:])  # 第2列及剩下的所有元素
输出结果为:
[2 4 5]
[3 4 5]
[[2 3]
 [4 5]
 [5 6]]

6. NumPy高级索引

NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。
整数数组索引 
以下实例获取数组中(0,0),(1,1)和(2,0)位置处的元素。
x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
y = x[[0,1,2],  [0,1,0]]  
print (y)
输出结果为:
[1  4  5]
以下实例获取了 4X3 数组中的四个角的元素。 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:' )
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  ('这个数组的四个角元素是:')
print (y)
输出结果为:
我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


这个数组的四个角元素是:
[[ 0  2]
 [ 9 11]]
返回的结果是包含每个角元素的 ndarray 对象。

布尔索引
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
以下实例获取大于 5 的元素:
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素  
print  ('大于 5 的元素是:')
print (x[x >  5])
输出结果为:
我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
大于 5 的元素是:
[ 6  7  8  9 10 11]

花式索引
花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。
花式索引跟切片不一样,它总是将数据复制到新数组中。
1、传入顺序索引数组
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]])
输出结果为:
[[16 17 18 19]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [28 29 30 31]]
2、传入倒序索引数组
实例
x=np.arange(32).reshape((8,4))
print (x[[-4,-2,-1,-7]])
输出结果为:
[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4  5  6  7]]
3、传入多个索引数组(要使用np.ix_)
x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
输出结果为:
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]

7. 广播操作

NumPy 广播(Broadcast) 
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
a = np.array([1,2,3,4]) 
b = np.array([10,20,30,40]) 
c = a * b 
print (c)
输出结果为:
[ 10  40  90 160]
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。如:
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]]

广播的规则:

  • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
  • 输出数组的形状是输入数组形状的各个维度上的最大值。
  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
  • 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

简单理解:对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:

  • 数组拥有相同形状。
  • 当前维度的值相等。
  • 当前维度的值有一个是 1。

若条件不满足,抛出 "ValueError: frames are not aligned" 异常。

8. 数组操作

https://www.runoob.com/numpy/numpy-array-manipulation.html

9. NumPy数学运算

10. NumPy IO

Numpy 可以读写磁盘上的文本数据或二进制数据。
NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。
npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。
常用的 IO 函数有:
load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。 
savze() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。 
loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)

numpy.save()
numpy.save() 函数将数组保存到以 .npy 为扩展名的文件中。
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
参数说明:
file:要保存的文件,扩展名为 .npy,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上。
arr: 要保存的数组
allow_pickle: 可选,布尔值,允许使用 Python pickles 保存对象数组,Python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。
fix_imports: 可选,为了方便 Pyhton2 中读取 Python3 保存的数据。
实例
a = np.array([1,2,3,4,5]) 
 
# 保存到 outfile.npy 文件上
np.save('outfile.npy',a) 
 
# 保存到 outfile2.npy 文件上,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上
np.save('outfile2',a)
b = np.load("filename.npy")


savetxt()
savetxt() 函数是以简单的文本文件格式存储数据,对应的使用 loadtxt() 函数来获取数据。
np.loadtxt(FILENAME, dtype=int, delimiter=' ')
np.savetxt(FILENAME, a, fmt="%d", delimiter=",")
参数 delimiter 可以指定各种分隔符、针对特定列的转换器函数、需要跳过的行数等。
实例
a = np.array([1,2,3,4,5]) 
np.savetxt('out.txt',a) 
b = np.loadtxt('out.txt')  
 
print(b)
输出结果为:
[1. 2. 3. 4. 5.]
使用 delimiter 参数:
a=np.arange(0,10,0.5).reshape(4,-1)
np.savetxt("out.txt",a,fmt="%d",delimiter=",") # 改为保存为整数,以逗号分隔
b = np.loadtxt("out.txt",delimiter=",") # load 时也要指定为逗号分隔
print(b)
输出结果为:
[[0. 0. 1. 1. 2.]
 [2. 3. 3. 4. 4.]
 [5. 5. 6. 6. 7.]
 [7. 8. 8. 9. 9.]]

读取存储csv

NumPy的savetxt()函数是与loadtxt()相对应的一个函数,它能以诸如CSV之类的区隔型文件格式保存数组np.savetxt('np.csv',a,fmt='%.2f',delimiter=',',header="#1,#2,#3,#4")
上面的函数调用中,我们规定了用以保存数组的文件的名称、数组、可选格式、间隔符和一个可选的标题

11. NumPy Matplotlib

import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y)
plt.show()

以上实例中,np.arange() 函数创建 x 轴上的值。y 轴上的对应值存储在另一个数组对象 y 中。 这些值使用 matplotlib 软件包的 pyplot 子模块的 plot() 函数绘制。

图形由 show() 函数显示。

12. NumPy.array

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

13. ndarray与tensor的相互转换

tensor转ndarray

直接转化
# -*- coding: utf-8 -*-
import tensorflow as tf
# 创建张量
t = tf.constant([1, 2, 3, 4], tf.float32)
# 创建会话
session = tf.Session()
# 张量转化为
ndarrayarray = session.run(t)

#利用Tensor的成员函数eval
import tensorflow as tf
# 创建张量t = tf.constant([1, 2, 3, 4], tf.float32)
# 创建会话session = tf.Session()
# 张量转化为ndarray
array = t.eval(session=session)

import tensorflow as tf
# 创建张量t = tf.constant([1, 2, 3, 4], tf.float32)
# 张量转化为ndarray
with tf.Session() as session:    
    array = t.eval()   

ndarray转化为tensor

TensorFlow 通过 convert_to_tensor 这个函数进行转换,代码如下:
# -*- coding: utf-8 -*
import tensorflow as tf
import numpy as np
#创建ndarray
array = np.array([1, 2, 3, 4], np.float32)
# 将ndarray转化为tensor
t = tf.convert_to_tensor(array, tf.float32, name='t')
# 打印输出print(t)Tensor("t:0", shape=(4,), dtype=float32)


 

 

 


 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值