参考文章:https://www.numpy.org.cn/user_guide/numpy_basics/array_creation.html
文章目录
一、数组的创建
创建Numpy数组有三种不同的方法
- 从列表等其他Python的结构进行转换
- 使用Numpy内部功能函数
- 使用特殊的库函数
1.从列表等其他Python的结构进行转换
从Python列表创建数组。将Python列表或元组传递给数组函数以创建Numpy数组:
import numpy as np
a = np.array([1, 2, 3]) # 创建一个一维数组
b = np.array([[1,2,3],[4,5,6]]) # 创建二维数组
print(a)
print(b)
# out
[1 2 3]
[[1 2 3]
[4 5 6]]
2.使用Numpy内部功能函数
Numpy具有许多用于创建数组的内置函数.
c = np.zeros((2,2)) # 创建一个元素全为0的2×2数组
d = np.ones((1,2)) # 创建一个元素全为1的1×2数组
e = np.full((2,2),7) # 创建一个元素全为7的2×2数组
f = np.eye(2) # 创建一个2×2的单位矩阵
h = np.arange(4) # 创建一个一维数组值为从0到3
print(c)
print(d)
print(e)
print(f)
print(g)
print(h)
# out 为了更好观察,中间加入空行
[[0. 0.]
[0. 0.]]
[[1. 1.]]
[[7 7]
[7 7]]
[[1. 0.]
[0. 1.]]
[0 1 2 3]
3.使用特殊的库函数
还可以使用特殊库函数来创建数组,比如random1。
g = np.random.random((2,2)) # 创建一个在半开区间[0,1)随机浮点数矩阵
print(g)
# out
[[0.41239857 0.10033721]
[0.74043293 0.81187285]]
二、结构化数组
结构化数组,其实就相当于C语言中结构体构成的数组。其数据类型是由组成一系列命名字段的简单数据类型组成的。
下面是一个很简单的例子
x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)],dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
print(x)
print(x['name'])
[('Rex', 9, 81.) ('Fido', 3, 27.)]
['Rex' 'Fido']
结构化数据类型的创建
想要创建结构化数组,就要定义结构化数据类型。结构化数据类型可以使用函数 numpy.dtype创建。 有4种可选形式的规范,其灵活性和简洁性各不相同。
1. 元组列表,每个字段一个元组
此方法用多个元组创建字段的结构化数据类型,每个元组有三个值(fieldname,datatype,shape),fieldname为字符串,表示字段名,datatype为数据类型(数据类型可使用数组协议类型字符串2),shape为可选参数,以控制字段矩阵大小。
>>>np.dtype([('x', 'f4'), ('y', np.float32), ('z', 'f4', (2,2))])
dtype([('x', '<f4'), ('y', '<f4'), ('z', '<f4', (2, 2))])
2. 一串用逗号分隔的dtype规范
这种简写表示法中,使用逗号分隔各字段数据类型,字段名称默认为f0,f1,f2…。
>>> np.dtype('i8,f4,S3')
dtype([('f0', '<i8'), ('f1', '<f4'), ('f2', 'S3')])
>>> np.dtype('3int8, float32, (2,3)float64')
dtype([('f0', 'i1', 3), ('f1', '<f4'), ('f2', '<f8', (2, 3))])
3. 字段参数数组的字典
这是最灵活的规范形式。字典一共有六个键,‘names’ ,‘formats’,‘offsets’,‘itemsize’,‘aligned’ 和 ‘titles’。‘names’ ,'formats’为必需的键,表示字段名和字段类型,其他键为可选键, ‘offsets’ 值应该是整数字节偏移量的列表,可选的 ‘itemsize’ 值应该是一个描述dtype的总大小(以字节为单位)的整数,它必须足够大以包含所有字段。'aligned’控制对齐,默认为False,设定为True可在某些情况提高性能。
>>> np.dtype({'names': ['col1', 'col2'], 'formats': ['i4','f4']})
dtype([('col1', '<i4'), ('col2', '<f4')])
>>> np.dtype({'names': ['col1', 'col2'],
... 'formats': ['i4','f4'],
... 'offsets': [0, 4],
... 'itemsize': 12})
dtype({'names':['col1','col2'], 'formats':['<i4','<f4'], 'offsets':[0,4], 'itemsize':12})
4. 字段名称的字典
不鼓励使用这种形式的规范,但也在此列出,因为较旧的numpy代码可能会使用它。字典的键是字段名称,值是指定类型和偏移量的元组:
>>> np.dtype=({'col1': ('i1',0), 'col2': ('f4',1)})
dtype([(('col1'), 'i1'), (('col2'), '>f4')])
三、数组的索引
数组索引指的是使用方括号([])来索引数组值。有很多选项来索引,这使numpy索引很强大,但功能上的强大也带来一些复杂性和潜在的混乱。
普通数组的索引有三种不同的方法
- 切片
- 整数索引
- 布尔索引
1.切片
# 1,切片
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
row_r1 = a[1, :]
row_r2 = a[1:2, :]
print(row_r1, row_r1.shape) # Prints "[5 6 7 8] (4,)"
print(row_r2, row_r2.shape) # Prints "[[5 6 7 8]] (1, 4)"
col_r1 = a[:, 1]
col_r2 = a[:, 1:2]
print(col_r1, col_r1.shape) # Prints "[ 2 6 10] (3,)"
print(col_r2, col_r2.shape) # Prints "[[ 2]
# [ 6]
# [10]] (3, 1)"
b = a[:2, 1:3] # 若数组为二维以上,切片会是原数组的浅拷贝
b[0][1] = 0
print(a)
print(b) #prints
#[[1 2 0]
# [4 5 6]
# [7 8 9]]
#[[2 0]
# [5 6]]
2. 整数索引
# 2. 整数索引
a = np.array([[1,2], [3, 4], [5, 6]])
print(a[[0, 1, 2], [0, 1, 0]]) # Prints "[1 4 5]"
# It can change element in a
3.布尔索引
# 3.布尔索引
a = np.array([[1,2], [3, 4], [5, 6]])
bool_idx = (a > 2) # 找到大于2的位置;
# 返回一个对应的布尔型数组
#
#
print(bool_idx) #[[False False]
# [ True True]
# [ True True]]
print(a[bool_idx]) # Prints "[3 4 5 6]"
print(a[a > 2]) # Prints "[3 4 5 6]"
结构化数组的索引有以下几种方法
- 通过使用字段名称索引数组
- 通过使用字段名列表索引数组
- 用整数索引获取结构化标量
1.通过使用字段名称索引数组
>>> x = np.array([(1,2),(3,4)], dtype=[('foo', 'i8'), ('bar', 'f4')])
>>> x['foo']
array([1, 3])
>>> x['foo'] = 10
>>> x
array([(10, 2.), (10, 4.)],
dtype=[('foo', '<i8'), ('bar', '<f4')])
2.通过使用字段名列表索引数组
>>> a = np.zeros(3, dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'f4')])
>>> a[['a', 'c']]
array([(0, 0.), (0, 0.), (0, 0.)],
dtype={'names':['a','c'], 'formats':['<i4','<f4'], 'offsets':[0,8], 'itemsize':12})
3.用整数索引获取结构化标量
>>> x = np.array([(1, 2., 3.)], dtype='i,f,f')
>>> scalar = x[0]
>>> scalar
(1, 2., 3.)
random模块是numpy中非常重要的一个模块,可以生成各种分布样本,如二项分布、Logistic分布、超几何分布等。具体内容可参考文章 numpy的random模块详细解析. ↩︎
数据协议类型字符串的使用规则见Numpy学习笔记(一)----数组. ↩︎