各位客官姥爷好,欢迎回来。上节我们了解numpy中数组的创建方法,这节我们来看看数组都有哪些常用的属性,以及数组的浅拷贝与深拷贝的用法。 01 数组的属性 0.声明一个numpy的数组 np.random.seed(0) x = np.random.randint(1,10,(2,3)) x array([[6, 1, 4], [4, 8, 4]]) 1.数组的类型 x.dtype dtype('int32') 2.数组的维数 x.ndim 2 3.数组的维度 x.shape (2, 3) 4.数组的元素个数 x.size 6 5.数组每个元素所占字节数 x.itemsize 4 6.数组所有元素总字节数(等于x.size * x.itemsize) x.nbytes 24 7.数组在内存中布局的信息 x.flags C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False 8.数组实部 x.real array([[6, 1, 4], [4, 8, 4]]) 9.数组的虚部 x.imag array([[0, 0, 0], [0, 0, 0]]) 10.数组的转置属性 x.T array([[6, 4], [1, 8], [4, 4]]) 11.数组的一维迭代器 y = x.flat for i in y: print(i) 6 1 4 4 8 4 当然也可通过这个迭代器去更改数组的元素 #比如全部改为9 x.flat = 9 x array([[9, 9, 9], [9, 9, 9]]) 02 数组的转化 1. 数组与列表的互转 #列表转为数组 x = [i for i in range(5)] arr = np.array(x) print(arr,type(arr)) #数组转为列表 y = arr.tolist() print(y, type(y)) [0 1 2 3 4] <class 'numpy.ndarray'> [0, 1, 2, 3, 4] <class 'list'> 2. 数组与元组的互转 没有直接转化的函数,这里使用python自带的类型转换函数 #元组转化为数组 x= (i for i in range(5)) arr = np.array(list(x)) print(arr,type(arr)) #数组转化为元组 y = tuple(arr.tolist()) print(y, type(y)) [0 1 2 3 4] <class 'numpy.ndarray'> (0, 1, 2, 3, 4) <class 'tuple'> 3. 数组类型的强制转化 #强制转化为float32,在转换类型时建议带上np.xx类型,避免有错误提示。 x= (i for i in range(5)) arr = np.array(list(x)) print(arr,type(arr)) arr.astype(np.float32) [0 1 2 3 4] <class 'numpy.ndarray'> array([0., 1., 2., 3., 4.], dtype=float32) 03 数组的浅拷贝与深拷贝 浅拷贝和深拷贝针对的是可变类型,而数组属于可变类型,故可使用。下面就来看看浅拷贝和深拷贝在numpy数组中的区别。 1. 浅拷贝 浅拷贝,是指新的对象和源对象指向同一个内存空间。注意这里的关键词:新对象和源对象,这两个是不同的对象。而我们通常在数组中用的赋值,只是给源对象起个别名,对象还是那个对象。 x = np.arange(5) y = x print(x is y) True 在numpy中view视图的用法相当于浅拷贝。 arr = np.arange(5) drr = arr.view() print(arr is drr) drr[0] =5 print(drr,arr) False [5 1 2 3 4] [5 1 2 3 4] 更改新建视图的元素后,原始数组也发生变化。 2. 深拷贝 通过上面的浅拷贝可以看出,这样很容易出现数据安全问题,对此出现了深拷贝,一个完全独立于源对象的副本。可直接使用数组的copy()方法实现 arr = np.arange(5) frr = arr.copy() print(arr is frr) frr[0] = 10 print(frr,arr) False [10 1 2 3 4] [0 1 2 3 4] 当然,也可使用我们上节学过的用法: 1)array的copy参数 arr = np.arange(5) err = np.array(arr,copy=True) print(arr is err) err[0] = 15 print(err,arr) False [15 1 2 3 4] [0 1 2 3 4] 2)array的subok参数 arr = np.arange(5) crr = np.array(arr,subok=True) print(arr is crr) crr[0] = 20 print(crr,arr) False [20 1 2 3 4] [0 1 2 3 4] 以上就是本次的分享,欢迎各位客官姥爷关注我,方便您第一次时间收到【干货】! |
|