日新月异 PyTorch - numpy 基础: numpy 数组的创建
日新月异 PyTorch - numpy 基础: numpy 数组的创建
示例如下:
numpy\demo1.py
import numpy as np
# 创建数组
def sample1():
# 通过 np.array() 创建 numpy 数组
a = np.array([1, 2, 3])
# dtype 用于获取数组元素的数据类型
print(a, a.dtype) # [1 2 3] int32
# 通过 tolist() 将 numpy 数组转换为 python 列表
print(a.tolist()) # [1, 2, 3]
b = np.array([1.2, 2.3, 3.4])
print(b, b.dtype) # [1.2 2.3 3.4] float64
# 创建数组时可以指定元素的数据类型
c = np.array([1, 2, 3], dtype=np.float32)
print(c, c.dtype) # [1. 2. 3.] float32
# 创建一个二维数组(创建更多维度的数组的方法也是一样的)
d = np.array([[1, 2, 3], [1.2, 2.3, 3.4]])
print(d, d.dtype)
'''
[[1. 2. 3. ]
[1.2 2.3 3.4]] float64
'''
# 创建一个二维数组(创建更多维度的数组的方法也是一样的),第一个维度有 2 个元素,第二个维度有 3 个元素,每个元素的初始值为 0
e = np.zeros((2, 3), dtype=np.int32)
print(e)
'''
[[0 0 0]
[0 0 0]]
'''
# 创建一个二维数组(创建更多维度的数组的方法也是一样的),第一个维度有 2 个元素,第二个维度有 3 个元素,每个元素的初始值为 1
f = np.ones((2, 3), dtype=np.int32)
print(f)
'''
[[1 1 1]
[1 1 1]]
'''
# 创建一个二维数组(创建更多维度的数组的方法也是一样的),第一个维度有 2 个元素,第二个维度有 3 个元素,每个元素的初始值为 10
g = np.full((2, 3), 10, dtype=np.int32)
print(g)
'''
[[10 10 10]
[10 10 10]]
'''
# 创建一个二维数组(创建更多维度的数组的方法也是一样的),第一个维度有 2 个元素,第二个维度有 3 个元素,每个元素的初始值是不确定的(取决于内存的状态)
i = np.empty((2, 3), dtype=np.int32)
print(i)
'''
[[ 858993459 1072902963 1717986918]
[1073899110 858993459 1074475827]]
'''
# 创建一个与指定数组形状一样的数组,并且每个元素的初始值为 10
# 注:类似的函数还有 zeros_like(), ones_like(), empty_like()
j = np.full_like([['a', 'b', 'c'], ['x', 'y', 'z']], 10, dtype=np.int32)
print(j)
'''
[[10 10 10]
[10 10 10]]
'''
# 创建一个数组,第一个元素是 10,最后一个元素小于 20,步长为 2
# 注:如果通过 arange 生成浮点元素的话,由于浮点数的计算精度问题,生成的元素个数可能会与预期的不一致
k = np.arange(10, 20, 2)
print(k) # [10 12 14 16 18]
# 创建一个从 0 到 5 的数组(左闭右开),默认步长为 1
print(np.arange(5)) # [0 1 2 3 4]
# 创建一个从 -5 到 5 的数组(左闭右开),默认步长为 1
print(np.arange(-5, 5)) # [-5 -4 -3 -2 -1 0 1 2 3 4]
# 创建一个数组,第一个元素是 0,最后一个元素是 2,数组共有 10 个元素并组成一个等差数列
l = np.linspace(0, 2, 10)
print(l) # [0. 0.22222222 0.44444444 0.66666667 0.88888889 1.11111111 1.33333333 1.55555556 1.77777778 2. ]
# 创建一个数组,第一个元素为 base 的 start 次幂,最后一个元素为 base 的 stop 次幂,数组共有 num 个元素并组成一个等比数列
m = np.logspace(start=1, stop=10, num=10, base=2, dtype=np.int32) # [2 4 8 16 32 64 128 256 512 1024]
print(m)
# 创建随机数组
def sample2():
# 创建一个随机数组,由 5 个元素组成,每个元素的值在 0 - 1 之间(左闭右开)
a = np.random.rand(5)
print(a) # [0.75315474 0.67089008 0.17151009 0.44270476 0.25025423]
# 创建一个随机二维数组,第一个维度有 2 个元素,第二个维度有 3 个元素,每个元素的值在 0 - 1 之间(左闭右开)
b = np.random.rand(2, 3)
print(b)
'''
[[0.76953115 0.44133723 0.85179982]
[0.61831559 0.55075848 0.10357527]]
'''
# 创建一个整型的随机数组,由 10 个元素组成,每个元素的值在 1 - 5 之间(左闭右开)
c = np.random.randint(1, 5, 10)
print(c) # [4 2 1 3 3 4 2 3 1 4]
# 创建一个整型随机二维数组,第一个维度有 2 个元素,第二个维度有 3 个元素,每个元素的值在 0 - 2 之间(左闭右开)
d = np.random.randint(0, 2, size=(2, 3))
print(d)
'''
[[1 0 1]
[0 0 0]]
'''
# 创建一个随机数组,由 10 个元素组成,生成的元素满足正态分布(中间多两边少)
e = np.random.randn(10)
print(e) # [ 0.66374357 0.93564559 0.6737554 -0.06053103 0.98480307 -0.58456542 -0.02358387 -0.03625614 0.1381879 -0.09059425]
# 创建一个随机二维数组,第一个维度有 2 个元素,第二个维度有 5 个元素,生成的元素满足正态分布
f = np.random.randn(2, 5)
print(f)
'''
[[-1.22189616 0.71962758 -0.91087972 -0.14592619 -0.20833151]
[-0.43292445 0.36449053 0.11183632 -1.07638197 0.93133669]]
'''
# 创建一个随机数组,由 10 个元素组成,生成的元素满足正态分布,且正态分布的均值为 0,标准差为 1
# 注:正态分布的均值就是所有数的平均值,标准差就是数据离平均值的距离的平均值,标准差越小则正态分布图越陡峭
g = np.random.normal(0, 1, 10)
print(g) # [-0.23735497 -1.36411278 0.17218445 0.31930431 0.73154514 -0.02001482 1.42222971 -0.97831937 -0.28327927 -0.30583383]
# 创建一个随机二维数组,第一个维度有 2 个元素,第二个维度有 5 个元素,生成的元素满足正态分布,且正态分布的均值为 0,标准差为 1
h = np.random.normal(0, 1, size=(2, 5))
print(h)
'''
[[ 1.32418668 1.24857085 0.59898245 -0.58185689 -0.57412149]
[-0.31750424 0.01306116 0.18447852 -0.40649248 -0.3384305 ]]
'''
# 从已有数据创建数组
def sample3():
# 通过 np.asarray() 或 np.array() 创建 numpy 数组
# 注:
# 如果原来的数据是 numpy 数组,则 np.asarray() 只是复制指针,而 np.array() 会复制数据
# 如果原来的数据是 python 原生的,则无论 np.asarray() 还是 np.array() 都会复制数据
a = np.asarray([1, 2, 3])
print(a) # [1 2 3]
# 通过 np.asarray() 或 np.array() 创建 numpy 数组
b = np.asarray([(1, 2, 3), (4, 5, 6)])
print(b)
'''
[[1 2 3]
[4 5 6]]
'''
# 将二进制数据转换为 numpy 数组
# dtype='S1' 的意思是,数组元素为 string 类型,且每个元素为 1 个 string
c = np.frombuffer(b'abcdef', dtype='S1')
print(c) # [b'a' b'b' b'c' b'd' b'e' b'f']
# 将二进制数据转换为 numpy 数组,数组元素为 np.uint8 类型
d = np.frombuffer(b'123456', dtype=np.uint8)
print(d) # [49 50 51 52 53 54]
# 将二进制数据转换为 numpy 数组,offset 为数据读取的起始位置,count 为读取的数据量
e = np.frombuffer(b'abcdef', dtype='S1', offset=1, count=2)
print(e) # [b'b' b'c']
# 将可迭代对象转换为 numpy 数组
f = np.fromiter(range(5), dtype=np.int32)
print(f) # [0 1 2 3 4]
if __name__ == '__main__':
# 创建数组
sample1()
# 创建随机数组
sample2()
# 从已有数据创建数组
sample3()