numpy基础之ndarray其他属性

1 numpy基础之ndarray其他属性

python数据分析的numpy库的ndarray对象除了内存布局属性外,还有数据类型属性及T、real等其他属性。

1.1 数据类型属性

ndarray的数据类型属性如下:

NO 属性 描述
1 dtype 数组元素的数据类型

1.1.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')

1.2 其他属性

ndarray的数据类型属性如下:

NO 属性 描述
1 T 转置数组
2 real 复数数组的实部
3 imag 复数数组的虚部
4 flat 数组的一维迭代器
5 ctypes 用于简化数组与ctypes模块交互的对象

1.2.1 T

描述

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)

1.2.2 real

描述

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.])

1.2.3 imag

描述

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.])

1.2.4 flat

描述

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]

1.2.5 ctypes

描述

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]])

你可能感兴趣的:(python,numpy,python)