Numpy

Numpy基础三

2019-01-20  本文已影响6人  __豆约翰__

唯一化和集合函数

Numpy提供了一些针对一维ndarray的基本集合运算。最常用的就是np.unique了,它用于找出数组中的唯一值并返回已排序的结果。

方法 说明
unique(x) 计算x中的唯一元素,并返回有序结果.
intersect1d(x, y) 计算x和y中的公共元素,并返回有序结果.
union1d(x, y) 计算x和y的并集,并返回有序结果.
in1d(x, y) 得到一个表示“x的元素是否包含于y”的布尔型数组.
setdiff1d(x, y) 集合的差,即元素在x中且不再y中.

  1. 唯一化
    import numpy as np

names = np.array(['aaa', 'bbb', 'ccc', 'aaa', 'ddd', 'eee', 'ccc'])
ndarray1 = np.random.randint(1, 5, 10)
ndarray2 = np.random.randint(1, 5, (3, 4))

ndarray1
array([4, 2, 1, 2, 2, 1, 4, 3, 2, 1])

ndarray2
array([[4, 3, 3, 1],
[1, 3, 1, 3],
[4, 4, 2, 1]])

np.unique(names)
array(['aaa', 'bbb', 'ccc', 'ddd', 'eee'], dtype='<U3')

np.unique(ndarray1)
array([1, 2, 3, 4])

  1. 计算两个数组交集
    ndarray3 = np.arange(1, 10)
    ndarray4 = np.arange(5, 15)

ndarray3
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

ndarray4
array([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

np.intersect1d(ndarray3, ndarray4)
array([5, 6, 7, 8, 9])

  1. 计算两个数组并集
    ndarray5 = np.arange(1, 10)
    ndarray6 = np.arange(5, 15)

ndarray5
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

ndarray6
array([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

np.union1d(ndarray5, ndarray6)
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

  1. 数组中的元素是否在另一个数组中存在
    ndarray7 = np.arange(1, 6)
    ndarray8 = np.arange(3, 8)

ndarray7
array([1, 2, 3, 4, 5])

ndarray8
array([3, 4, 5, 6, 7])

np.in1d(ndarray7, ndarray8)
array([False, False, True, True, True], dtype=bool)

  1. 计算两个数组的差集
    ndarray9 = np.arange(1, 6)
    ndarray10 = np.arange(3, 8)

ndarray9
array([1, 2, 3, 4, 5])

ndarray10
array([3, 4, 5, 6, 7])

np.intersect1d(ndarray9, ndarray10)
array([3, 4, 5])

np.setdiff1d(ndarray9, ndarray10)
array([1, 2])

随机数生成函数

numpy.random模块对Python内置的random进行了补充。我们使用numpy.random可以很方便根据需要产生大量样本值。而python内置的random模块则一次生成一个样本值.

函数 说明
permutation 如果给的数字,则生成指定个数随机数 ,如果是数组,则打乱数组返回.
shuffle 打乱一个序列的原有顺序.
randint 从给定的上下限随机选取整数.
import numpy as np

ndarray1 = np.arange(10)
np.random.permutation(5)
array([3, 4, 1, 2, 0])

np.random.permutation(ndarray1)
array([3, 9, 2, 7, 5, 1, 0, 8, 4, 6])

np.random.shuffle(ndarray1)
ndarray1
array([5, 0, 9, 3, 6, 2, 7, 4, 1, 8])

np.random.randint(10, 20)
14

np.random.randint(10, 20, 20)
rray([18, 11, 15, 15, 19, 16, 13, 17, 18, 13, 14, 10, 11, 14, 16, 10, 19, 16, 16, 11])

np.random.randint(10, 20, (3, 4))
array([[12, 13, 12, 10],
[15, 12, 15, 10],
[14, 15, 11, 18]])

数组排序函数

  1. 对一维数组排序
    import numpy as np

ndarray1 = np.random.randint(1, 10, (1, 5))
ndarray1.sort()
ndarray1
array([[3, 3, 5, 7, 8]])

  1. 对二维数组排序
    ndarray2 = np.random.randint(1, 10, (5, 5))
    ndarray2
    array([[4, 9, 5, 3, 4],
    [3, 9, 4, 8, 5],
    [4, 8, 3, 4, 7],
    [9, 5, 9, 8, 1],
    [1, 3, 2, 1, 4]])

对每行数据进行排序
ndarray2.sort()
ndarray2
array([[3, 4, 4, 5, 9],
[3, 4, 5, 8, 9],
[3, 4, 4, 7, 8],
[1, 5, 8, 9, 9],
[1, 1, 2, 3, 4]])

对每列数据进行排序
ndarray2.sort(axis=0)
ndarray2
array([[1, 1, 2, 3, 4],
[1, 4, 4, 5, 8],
[3, 4, 4, 7, 9],
[3, 4, 5, 8, 9],
[3, 5, 8, 9, 9]])

ndarray3 = np.sort(ndarray2) 返回排序副本,源数据不变
ndarray3
array([[1, 1, 2, 3, 4],
[1, 4, 4, 5, 8],
[3, 4, 4, 7, 9],
[3, 4, 5, 8, 9],
[3, 5, 8, 9, 9]])

数组输入和输出

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以原始二进制格式保存在扩展名为.npy的文件中。如果在保存文件时没有指定扩展名.npy,则该扩展名会被自动加上。

通过np.savez可以将多个数组保存到同一个文件中,将数组以关键字参数的形式传入即可。

例如: np.savez(‘myarr.npz’, a=arr1, b=arr2) 加载文件的时候,我们会得到一个类似字典的对象。
import numpy as np

ndarray1 = np.random.randint(1, 50, (5, 6))
ndarray1
array([[47, 36, 48, 29, 20, 2],
[37, 32, 19, 48, 40, 10],
[29, 23, 10, 40, 32, 21],
[37, 30, 40, 27, 24, 36],
[26, 43, 2, 29, 12, 42]])

将单个数组写入到文件中
np.save('ndarray1', ndarray1)

从文件中读取数组
ndarray2 = np.load('ndarray1.npy')
ndarray2
array([[47, 36, 48, 29, 20, 2],
[37, 32, 19, 48, 40, 10],
[29, 23, 10, 40, 32, 21],
[37, 30, 40, 27, 24, 36],
[26, 43, 2, 29, 12, 42]])

ndarray3 = np.random.randint(1, 50, (8, 8))
ndarray3
array([[19, 22, 2, 30, 43, 32, 44, 19],
[ 9, 8, 13, 36, 8, 46, 29, 28],
[ 9, 31, 23, 7, 3, 30, 39, 32],
[ 4, 2, 3, 11, 2, 7, 26, 5],
[ 8, 17, 33, 18, 18, 13, 46, 18],
[ 5, 12, 14, 18, 39, 36, 23, 44],
[24, 44, 3, 20, 7, 3, 9, 4],
[28, 35, 11, 26, 2, 48, 33, 16]])

写入多个数组到文件中
np.savez('ndarray2Andndarray3', n2=ndarray2, n3=ndarray3)

从文件中读取数组
ndarray4 = np.load('ndarray2Andndarray3.npz')
ndarray4['n2']
array([[47, 36, 48, 29, 20, 2],
[37, 32, 19, 48, 40, 10],
[29, 23, 10, 40, 32, 21],
[37, 30, 40, 27, 24, 36],
[26, 43, 2, 29, 12, 42]])

ndarray4['n3']
array([[19, 22, 2, 30, 43, 32, 44, 19],
[ 9, 8, 13, 36, 8, 46, 29, 28],
[ 9, 31, 23, 7, 3, 30, 39, 32],
[ 4, 2, 3, 11, 2, 7, 26, 5],
[ 8, 17, 33, 18, 18, 13, 46, 18],
[ 5, 12, 14, 18, 39, 36, 23, 44],
[24, 44, 3, 20, 7, 3, 9, 4],
[28, 35, 11, 26, 2, 48, 33, 16]])

读写文本文件

从文件中加载文本是一个非常标准的任务。Python中的文件读写函数的格式很容易将新手搞晕,所以我们使用np.loadtxt或者更加专门化的np.genfromtxt将数据加载到普通的Numpy数组中。 这些函数都有许多选项可供使用:指定各种分隔符、跳过行数等。我们以一个简单的逗号分割文件(csv)为例:
import numpy as np

ndarray1 = np.array([
['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
['fff', 'ggg', 'hhh', 'iii', 'jjj'],
['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
['fff', 'ggg', 'hhh', 'iii', 'jjj']
])

ndarray1
array([['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
['fff', 'ggg', 'hhh', 'iii', 'jjj'],
['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
['fff', 'ggg', 'hhh', 'iii', 'jjj']],
dtype='<U3')

将数组保存成csv文件,每个数据之间用逗号隔开
np.savetxt('ndarray1.csv', ndarray1, delimiter=',', fmt='%s')

np.genfromtxt('ndarray1.csv', delimiter=',', dtype=np.unicode)
array([['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
['fff', 'ggg', 'hhh', 'iii', 'jjj'],
['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
['fff', 'ggg', 'hhh', 'iii', 'jjj']],
dtype='<U3')

上一篇下一篇

猜你喜欢

热点阅读