numpy之003ndarray

发布时间 2023-12-10 17:17:27作者: Allen_Hao

numpy常用的函数和属性

 

函数

语法:numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

  • object:任何暴露数组接口方法的对象,通常是列表或元组。
  • dtype:数组的所需数据类型,可选。
  • copy:默认为True,意味着创建对象的副本。如果设置为False,则尝试使用原始对象。
  • order:{'C', 'F', 'A', 'K'},指定数组的内存布局。'C'代表C语言风格,'F'代表Fortran风格,'A'代表'F'如果原数组是Fortran连续的,否则是'C','K'代表尽可能保持原数组的内存布局。
  • subok:默认为False,返回一个基本类型数组。如果为True,则返回子类。
  • ndmin:指定返回数组的最小维度。默认是根据列表、元组情况而定

示例

1. 列表转化ndarray对象

import numpy as np

list1 = [1, 2, 3, 4]
arr1 = np.array(list1)
print(arr1)  # 输出: [1 2 3 4]

 2. 指定数据类型

 记得有默认值

3. 多维数组

 列表有逗号,ndarray没有哦

4. 最小维度

 因为指定nmid为2,即使列表是一维也是会转化为2维的

5. 是否copy


list1 = [1, 2, 3, 4, 5]
arr5 = np.array(list1, copy=False)
print(list1)
list1[0] = 10
print(arr5) # 没有影响
print(list1)

print()

list1 = [1, 2, 3, 4, 5]
arr5 = np.array(list1, copy=True)
print(list1)
list1[0] = 10
print(arr5)
print(list1)

print()

arr6 = np.array(arr5, copy=False)
arr5[0] = 88
print(arr5)
print(arr6)

print()

print(arr6)
arr7 = np.array(arr6, copy=True)
arr6[0] = 188
print(arr6)
print(arr7)

 

 

 从测试结果看,copy属性对列表转ndarray没有影响,ndarry转ndarray有影响

 

numpy.dtype(obj, align=False, copy=False)

在NumPy中,dtype(数据类型)是一个对象,它描述了数组中元素的数据类型。每个NumPy数组都有一个dtype属性,用于定义其元素的数据类型。dtype不仅包含基本的类型信息(如floatint等),还可以描述更复杂的数据结构,比如结构化数据类型

  • obj:用于定义数据类型的对象。可以是字符串、Python类型(如float)、另一个dtype对象,或者是表示字段的字典或元组列表。
  • align:如果为True,则字段将按C语言结构体的方式进行字节对齐。
  • copy:如果为True,则创建dtype对象的副本。

 示例

1. 基本数据类型

 2. 使用字符串定义数据类型

 

 3. 更复杂的结构化数据类型

 4.使用元组定义数据类型(带有字段名)

 i1表示是1个字节的int 

f4表示是4个字节 的float

 

ChatGPT

在NumPy中,dtype(数据类型)是一个对象,它描述了数组中元素的数据类型。每个NumPy数组都有一个dtype属性,用于定义其元素的数据类型。dtype不仅包含基本的类型信息(如floatint等),还可以描述更复杂的数据结构,比如结构化数据类型。

语法 numpy.dtype(obj, align=False, copy=False)

dtype的基本语法如下:

numpy.dtype(obj, align=False, copy=False)
  • obj:用于定义数据类型的对象。可以是字符串(如'float32')、Python类型(如float)、另一个dtype对象,或者是表示字段的字典或元组列表。
  • align:如果为True,则字段将按C语言结构体的方式进行字节对齐。
  • copy:如果为True,则创建dtype对象的副本。

示例

  1. 基本数据类型

    python
    import numpy as np dtype_float = np.dtype(np.float32) print(dtype_float) # 输出: float32
  2. 使用字符串定义数据类型

    python
    dtype_int = np.dtype('int') print(dtype_int) # 输出: int32 或 int64 取决于系统
  3. 更复杂的结构化数据类型

    python
    dtype_complex = np.dtype([('real', np.float32), ('imag', np.float32)]) print(dtype_complex) # 输出: [('real', '<f4'), ('imag', '<f4')]
  4. 使用元组定义数据类型(带有字段名)

    python
    dtype_structured = np.dtype([('age', np.int8), ('height', np.float32)]) print(dtype_structured) # 输出: [('age', 'i1'), ('height', '<f4')]

最佳实践

  • 明确数据类型:在创建数组时,最好明确指定dtype,特别是在性能和精度方面有特定要求的情况下。
  • 使用结构化数据类型:当需要在数组中存储复合数据(例如表格数据)时,可以使用结构化数据类型。
  • 内存优化:根据数据的范围选择合适的数据类型,以节省内存。例如,如果数据的范围在0到255之间,使用np.uint8
  • 类型转换:了解如何在不同的数据类型之间转换,这对于处理外部数据和进行数值运算非常重要。

 

 

 

 

 

属性

dtype(数据类型)

 

1. 布尔型

  • bool_:布尔值,True 或 False。

2. 整型

  • int_:默认的整数类型(类似于C中的long;通常是int64int32)。
  • intc:C语言中的int类型,通常是int32int64
  • intp:用于索引的整数类型(类似于C中的ssize_t;通常是int32int64)。
  • int8, int16, int32, int64:分别代表8位、16位、32位、64位整数。

3. 无符号整型

  • uint8, uint16, uint32, uint64:分别代表8位、16位、32位、64位无符号整数。

4. 浮点型

  • float_:默认的浮点类型(类似于C中的double;通常是float64)。
  • float16, float32, float64:分别代表16位、32位、64位浮点数。

5. 复数型

  • complex_:默认的复数类型(类似于C中的double组成的复数;通常是complex128)。
  • complex64, complex128:分别代表由两个32位浮点数(实部和虚部)和两个64位浮点数组成的复数。

 

 

6. 对象类型

  • object_:表示Python对象类型。这种类型用于存储任意Python对象,但通常在需要数组元素为多种类型或包含复杂对象时使用。

7. 字符串类型

  • string_:表示固定长度的字符串类型,每个字符占用一个字节。例如,string_[n]表示长度为n的字符串。
  • unicode_:表示固定长度的Unicode类型(在Python 3中,等同于str类型)。例如,unicode_[n]表示长度为n的Unicode字符串。

8. 时间类型

  • datetime64:表示日期和时间的类型。
  • timedelta64:表示时间差(两个datetime64类型数据之间的差)。

9. 其他类型

  • bytes_:固定长度的字节序列。
  • void:表示空(无数据)的类型,通常用于表示结构化数组的元素。
import numpy as np

# 布尔型
arr_bool = np.array([True, False, True], dtype=np.bool_)
print(arr_bool)

# 整型
arr_int32 = np.array([1, 2, 3], dtype=np.int32)
print(arr_int32)

# 无符号整型
arr_uint8 = np.array([1, 2, 3], dtype=np.uint8)
print(arr_uint8)

# 浮点型
arr_float64 = np.array([1.0, 2.0, 3.0], dtype=np.float64)
print(arr_float64)

# 复数型
arr_complex128 = np.array([1+2j, 3+4j, 5+6j], dtype=np.complex128)
print(arr_complex128)

# 对象类型
arr_object = np.array([1, 'a', True], dtype=np.object_)
print(arr_object)

# 字符串类型
arr_string = np.array(['apple', 'banana', 'cherry'], dtype=np.string_)
print(arr_string)

# Unicode类型
arr_unicode = np.array(['apple', 'banana', 'cherry'], dtype=np.unicode_)
print(arr_unicode)


# 时间类型
arr_datetime = np.array(['2021-01-01', '2021-01-02'], dtype='datetime64')
print(arr_datetime)

# 时间差类型
arr_timedelta = np.array([np.datetime64('2021-01-01') - np.datetime64('2020-01-01')], dtype='timedelta64')
print(arr_timedelta)

# 字节类型
arr_bytes = np.array([b'abc', b'def'], dtype=np.bytes_)
print(arr_bytes)

# 创建结构化数组
arr_void = np.array([(1, 'a', 0.5)], dtype=[('x', 'i4'), ('y', 'S1'), ('z', 'f4')])
print(arr_void)

  • 明确地指定dtype可以确保数据的一致性和预期行为,尤其是在涉及数值计算时。
  • 选择合适的dtype以优化性能和内存使用。例如,对于只需要小整数的情况,使用int8uint8比默认的int64更节省内存。
  • 对于复杂计算,使用高精度的数据类型(如float64complex128)以提高计算精度,但需注意这会增加内存消耗。
  • 当处理大型数据集时,合理选择数据类型对于内存管理和性能优化至关重要
  • 使用object_类型时需谨慎,因为它会牺牲NumPy数组的许多优点,如高效的内存使用和快速的数学运算。
  • 对于文本数据,明确区分string_unicode_类型,特别是在处理非英文字符时。
  • 日期和时间数据类型,如datetime64timedelta64,非常适合处理时间序列数据。

 

ndarray

 

函数

 

属性