Numpy学习笔记(二)----数组

参考文章:https://www.numpy.org.cn/user_guide/numpy_basics/array_creation.html

一、数组的创建

创建Numpy数组有三种不同的方法
  1. 从列表等其他Python的结构进行转换
  2. 使用Numpy内部功能函数
  3. 使用特殊的库函数

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. 切片
  2. 整数索引
  3. 布尔索引
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. 通过使用字段名称索引数组
  2. 通过使用字段名列表索引数组
  3. 用整数索引获取结构化标量

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

  1. random模块是numpy中非常重要的一个模块,可以生成各种分布样本,如二项分布、Logistic分布、超几何分布等。具体内容可参考文章 numpy的random模块详细解析. ↩︎

  2. 数据协议类型字符串的使用规则见Numpy学习笔记(一)----数组. ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值