1 创建
import numpy as np
a = np.array([1,2,3,4])
b = np.array((5,6,7,8))
c = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
print('a=',a)
print('b=',b)
print('c=',c)
结果:
- 数组的形状可以通过其shape属性获取
print('a.shape=', a.shape)
print('b.shape=', b.shape)
print('c.shape=', c.shape)
结果:
- 变更数组形状
c.shape = (4,3)
print('c=',c)
结果:
- 自动计算形状(某一个纬度形状为-1时,由其他纬度来推断此纬度的值)
c.shape=(2,-1)
print('c=',c)
结果:
- 创建新的形状,而不影响现在的形状
d = a.reshape(2, 2)
print('d=', d)
print('a=', a)
结果:
- 此时a和d共享数据,改变其中一个,另外一个也同时改变
a[1]=100
print('d=', d)
print('a=', a)
2 元素类型
- 数组的元素类型可以通过dtype属性获取。
c.dtype
结果:
dtype('int64')
- 通过dtype参数可以在创建数组时指定元素类型
ai32 = np.array([1,2,3,4], dtype=np.int32)
af = np.array([1,2,3,4], dtype=float)
ac = np.array([1,2,3,4], dtype=complex)
print('ai32=%s, dtype=%s' % (ai32,ai32.dtype))
print('af=%s, dtype=%s' % (af,af.dtype))
print('ac=%s, dtype=%s' % (ac,ac.dtype))
结果:
-
Numpy支持的数据类型
NumPy中的每个数值类型都有几种字符串表示方式,字符串和类型之间的对应关系都存储在typeDict字典中。
set(np.typeDict.values())
dict(np.typeDict.items())
结果:
2.1 数据类型对象 (dtype)
数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面:
- 数据的类型(整数,浮点数或者 Python 对象)
- 数据的大小(例如, 整数使用多少个字节存储)
- 数据的字节顺序(小端法或大端法)
- 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
- 如果数据类型是子数组,它的形状和数据类型
字节顺序是通过对数据类型预先设定"<“或”>“来决定的。”<“意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。”>"意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
dtype 对象是使用以下语法构造的:numpy.dtype(object, align, copy)
- object - 要转换为的数据类型对象
- align - 如果为 true,填充字段使其类似 C 的结构体。
- copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
import numpy as np
# 使用标量类型
dt = np.dtype(np.int32)
print(dt)
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
dt1 = np.dtype('i4')
print(dt1)
# 字节顺序标注
dt2 = np.dtype('<i4')
print(dt2)
# 首先创建结构化数据类型
dt3 = np.dtype([('age',np.int8)])
print(dt3)
# 将数据类型应用于 ndarray 对象
a = np.array([(10,),(20,),(30,)], dtype = dt3)
print('a=%s, dtype=%s' % (a,a.dtype))
# 类型字段名可以用于存取实际的 age 列
print('a=%s' % a['age'])
2.1.1 示例
下面的示例定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象。
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print(a)
2.2 数值计算
通 过NumPy的数值类型也可以创建数值对象,下面创建一个16位的符号整数对象,它与Python的整数对象不同的是,它的収值范围有限,因此计算200*200会溢出,得到一个负数,这一点与C 语言的16位整数的结果相同:
Numpy的数值对象的运兑速度比Python的内置类型的运兑速度慢很多,如果程序中耑要大量地对单个数值运兑,应当尽量避免使用Numpy的数值对象。
2.3 数据类型转换
使用astype()
方法可以对数组的元素类型进行转换,下面将浮点数数组t l 转换为32位整数
数组,将双精度的复数数组12转换成单精度的复数数组:
tl = np.array([l, 2 , 3, A], dtype=np.float)
t2 = np.array([1, 2, 3, 4], dtype=np.complex)
t3 = tl.astype(np.int32)
t4 = t2.astype(np.complex64)
3 自动创建
除了1节中,通过创建序列后,在使用array
函数可以创建ndarray对象。也可以直接使用下列函数直接创建。
3.1 通过指定数值范围创建
numpy提供了类似于内置函数range()
,通过指定数值范围来创建数组的函数。以arange()
为例:
b = np.arange(1,4,1)
print(b)
print(type(b))
结果:
具体函数:
函数 | 说明 | 示例 |
---|---|---|
arange() | 指定开始值、终值和步长来创建表示等差数列的一维数组,注意所得到的结果中不包含终值。 | np.arange(1,4,1) |
linspace() | 通过指定幵始值、终值和元素个数来创建表示等差数列的一维数组,可以通过endpoint 参数指定是否包含终值,默认值为True,即包含终值。 |
np.linspace(1,8,7,endpoint=False) |
logspace() | 和 linspace() 类似,不过它所创建的数组是等比数列。基数可以通过base参数指定,其默认值为10。 |
np.logspace(0,1,12,base=2,endpoint=False) |
3.2 通过指定形状和类型来创建
zeros()、 ones()、 empty()、full()等可以创建指定形状和类型的数组。以empty举例:
import numpy as np
# 创建一个形状为(2,3)、元素类型为整数的数组,注意其中的元素值没有被初始化
a = np.empty((2,3),np.int32)
print(a)
结果:
具体函数说明:
函数 | 说明 | 示例 |
---|---|---|
empty() | 只分配数组所使用的内存,不对数组元素进行初始化操作,因此它的运行速度是最快的。 | np.empty((2,3),np.int32) |
zeros() | 将数组元素初始化为0 | np.zeros((2,3),np.int32) |
ones() | 将数组元素初始化为1 | np.ones((2,3),np.int32) |
full() | 将数组元素初始化为指定的值 | np.full((2,3),np.pi) |
zeros_like() | ||
ones_like() | ||
empty_like() | ||
full_like() |