python数据分析的numpy库的ndarray对象除了内存布局属性外,还有数据类型属性及T、real等其他属性。
ndarray的数据类型属性如下:
NO | 属性 | 描述 |
---|---|---|
1 | dtype | 数组元素的数据类型 |
描述
ndarray.dtype返回数组元素的数据类型。
示例
>>> import numpy as np
>>> arr1=np.array([1,2,3])
>>> arr1
array([1, 2, 3])
# 通过 ndarray.dtype 获取ndarray的数据类型
>>> arr1.dtype
dtype('int32')
ndarray的数据类型属性如下:
NO | 属性 | 描述 |
---|---|---|
1 | T | 转置数组 |
2 | real | 复数数组的实部 |
3 | imag | 复数数组的虚部 |
4 | flat | 数组的一维迭代器 |
5 | ctypes | 用于简化数组与ctypes模块交互的对象 |
描述
ndarray.T对数组进行转置,原数组不变。
一维数组转置前后相同。
二维及以上数组,转置后,轴数量不变,形状改变。
示例
>>> import numpy as np
>>> ar1=np.array([1,2,3])
>>> ar1
array([1, 2, 3])
# T对数组进行转置,生成新的数组,原数组不变
# 一维数组转置前后相同
>>> ar1.T
array([1, 2, 3])
>>> ar2=np.array([[1,2,3],[5,6,7]])
>>> ar2
array([[1, 2, 3],
[5, 6, 7]])
# 二维数组,转置后,轴数量不变,形状改变
>>> ar2T=ar2.T
>>> ar2T
array([[1, 5],
[2, 6],
[3, 7]])
>>> ar2.ndim
2
>>> ar2.shape
(2, 3)
>>> ar2T.ndim # 轴数量不变
2
>>> ar2T.shape # 形状改变,轴大小互换
(3, 2)
>>> ar3=np.array([[[1,2,3],[5,6,7]]])
>>> ar3
array([[[1, 2, 3],
[5, 6, 7]]])
# 三维数组,转置后,轴数量不变,形状改变
>>> ar3T=ar3.T
>>> ar3T
array([[[1],
[5]],
[[2],
[6]],
[[3],
[7]]])
>>> ar3.ndim
3
>>> ar3.shape
(1, 2, 3)
>>> ar3T.ndim # 轴数量不变
3
>>> ar3T.shape # 形状改变,轴大小互换
(3, 2, 1)
描述
ndarray.real返回数组复数数据类型的实部。
z=a+bj,z表示复数,a为复数的实部,b为复数的虚部。
示例
>>> import numpy as np
# z=a+bj,z表示复数,a为复数的实部,b为复数的虚部
>>> ar1=np.array([1+2j,3+5j])
>>> ar1
array([1.+2.j, 3.+5.j])
# real 返回复数的实部
>>> ar1.real
array([1., 3.])
描述
ndarray.imag返回数组复数数据类型的虚部。
示例
>>> import numpy as np
# z=a+bj,z表示复数,a为复数的实部,b为复数的虚部
>>> ar1=np.array([1+2j,3+5j])
>>> ar1
array([1.+2.j, 3.+5.j])
# imag 返回复数的虚部
>>> ar1.imag
array([2., 5.])
描述
numpy.ndarray.flat 返回数组全部元素组成的一维迭代器。
类似内置迭代器对象,支持索引和遍历等操作。
示例
>>> import numpy as np
>>> ar1=np.array([[1,2,3],[4,5,6]])
>>> ar1
array([[1, 2, 3],
[4, 5, 6]])
# numpy.ndarray.flat返回数组的全部元素组成的一维迭代器
>>> ar1_flat=ar1.flat
>>> from collections.abc import Iterable
# flat 返回可迭代对象
>>> isinstance(ar1_flat,Iterable)
True
# 遍历 flat 返回的迭代器
>>> [i for i in ar1_flat]
[1, 2, 3, 4, 5, 6]
# 支持索引操作
>>> ar1_flat[2]
3
# 获取长度
>>> len(ar1_flat)
6
# 转换为list
>>> list(ar1_flat)
[1, 2, 3, 4, 5, 6]
>>> ar1_T=ar1.T
>>> ar1_T_flat=ar1_T.flat
>>> ar1_T
array([[1, 4],
[2, 5],
[3, 6]])
>>> [i for i in ar1_T_flat]
[1, 4, 2, 5, 3, 6]
描述
numpy.ndarray.ctypes 返回一个对象,用于简化数组与ctypes模块的交互。
numpy.ndarray.ctypes.data 返回数组内存地址。
numpy.ndarray.ctypes.data_as 返回数据指针,指向数组的引用。
(ctypes.c_uint32*ar1.size).from_address(numpy.ndarray.ctypes.data) 创建与ndarray相同地址的数组。
示例
>>> import numpy as np
>>> import ctypes as ct
>>> ar1=np.array([[11,12,13],[15,16,18]])
>>> ar1
array([[11, 12, 13],
[15, 16, 18]])
>>> ar1.dtype
dtype('int32')
# numpy.ndarray.ctypes 返回一个对象,
# 用于简化数组与ctypes模块的交互。
>>> ar1_ctypes=ar1.ctypes
# data 返回数组内存区域的指针,为整数
>>> cdata=ar1_ctypes.data
>>> ar1_ctypes
<numpy.core._internal._ctypes object at 0x000001FBFFEAEF10>
>>> cdata
2181668883056
# data_as 返回数据指针,指向数组的引用
>>> cdata32=ar1_ctypes.data_as(ct.POINTER(ct.c_uint32))
>>> cdata32
<__main__.LP_c_ulong object at 0x000001FBFFF26440>
# 对 data_as 数据进行遍历
>>> [cdata32[i] for i in range(ar1.size)]
[11, 12, 13, 15, 16, 18]
# 创建数组b,共用 numpy.ndarray.ctype.data 地址
# ar1_ctypes 与 b 进行交互
>>> b=(ct.c_uint32*ar1.size).from_address(cdata)
>>> b
<__main__.c_ulong_Array_6 object at 0x000001FBFFECEE40>
>>> b[:]
[11, 12, 13, 15, 16, 18]
# 修改 ar1 的第1个元素
>>> ar1[0][0]
11
>>> ar1[0][0]=21
>>> ar1[0][0]
21
>>> ar1
array([[21, 12, 13],
[15, 16, 18]])
# b的元素也被修改,因为指向相同的地址
>>> b[:]
[21, 12, 13, 15, 16, 18]
# 修改 b 的元素
>>> b[1]=22
>>> b[:]
[21, 22, 13, 15, 16, 18]
>>> ar1
array([[21, 22, 13],
[15, 16, 18]])