我也不知道大家为什么都这样导入
# 一个人这样使用也罢了,几乎所有人都这样,我也跟随吧
import numpy as np arr = np.array([1, 2, 3, 4]) # 创建 print(arr) # [1 2 3 4] print(type(arr)) # <class 'numpy.ndarray'> print(arr.dtype) # int32,跟随系统,有的机器是int64 # 其它创建方式 arr2 = np.array(range(1, 10, 2)) # 创建 [1 3 5 7 9] arr3 = np.arange(1, 10, 2) # 创建 [1 3 5 7 9] ,np自带函数:arange(),效果与上相同 arr4 = np.array(range(10), dtype="uint8") # 创建 无符号8位数
数据类型(dtype)
int8,int16,int32,int64(对应无符号uint8,uint16,uint32,uint64),bool,float16(32,64)
改变数据类型
""" 1. astpye改变 astpye()函数改变后,会返回一个新的地址,不改变原来的 """ arr = np.array([1, 2, 3, 4], dtype="int64") # 创建 64位类型 arr2 = arr.astype("int16") # astpye(),改为16位,并返回一个新的数组 print(arr.dtype) # int64 print(arr2.dtype) # int16 # 顺便看一下它们的地址,它们会占用新的内存地址, print(id(arr)) # 1217452886416 print(id(arr2)) # 1217453015088
方法1:astype()
arr = np.array([1, 2, 3, 4], dtype="int64") # 创建 64位类型 print(id(arr)) # 2416301033872 """ 我想改变为16位,此64位不再使用, 可不可以直接赋值,为节约内存呢? 我们测试一下 """ arr = arr.astype("int16") # 直接赋值给原来的arr,看地址会不会变? print(id(arr)) # 2416301162544 """ 它们的地址是不同的,说明指针变化了
我的机器是:虽然2个不同的指针,但数据都指向同一数据,内存没有浪费。
但有的机器或系统就不一样了,会产生新的数据,可能过一会python 才会自动销毁它,甚至一直存在,造成内存浪费。
大家可百度了解一下:python interning 机制 """
方法2:赋值法
arr = np.array([1, 2, 3, 4], dtype="int64") # 创建 64位类型 print(id(arr)) # 1751221848464 arr.dtype = "int8" # 对arr直接赋值新的数据类型 print(id(arr)) # 1751221848464 """ 地址不会改变,并修改了数据类型 """
建议使用第二种吧。就像字符串的连接,尽量使用format,而不是“+”或join()
数组形状(shape)
也叫做维度
s1 = np.array([1,1,1]) print(s1.shape) # (3,)
数组的维度,shape(a,b,c,d.....),a为最外层,b进一层,c再进一层,一直到最后才是里面的
维度必须对称,例如:
[ [1,1], [1,1], [1,1] ] ------shape(3,2),数组内有3组,每次2个数字。
[ [1,1], [1,1], [1] ] ------这个定义可以吗?当然不可以,执行时会报错
因为它的意思是:数组含有3组,每组2个数字,而最后一个只有1个数字了,解释不通。
从流中,创建动态数组
np.frombuffer(buffer, dtype = float, count = -1, offset = 0)
Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。
参数 描述
buffer 可以是任意对象,会以流的形式读入。
dtype 返回数组的数据类型,可选
count 读取的数据数量,默认为-1,读取所有数据。
offset 读取的起始位置,默认为0。
ss = b"I lovo china" arr = np.frombuffer(ss, dtype="S1") print(arr) # [b'I' b' ' b'l' b'o' b'v' b'o' b' ' b'c' b'h' b'i' b'n' b'a'] arr2 = np.frombuffer(ss, dtype="S3") print(arr2) # [b'I l' b'ovo' b' ch' b'ina']
# 注意,如果不能平均分成3份时,会报错