官网:https://www.lanqiao.cn/courses/29224/learning/?id=1723394&compatibility=false
1、intc
intc
在编程中通常指的是与C语言中的int
类型相对应的整数类型,它通常是32位或64位的整数。
具体来说,intc
是一个在某些编程环境中使用的术语,它代表一个整数类型,这个类型在不同系统或编译器下可能有不同的长度,但通常与C语言标准中的int
类型相对应。在C语言标准中,int
类型的大小取决于实现定义,但在大多数现代架构上,int
通常是32位(即int32
)或64位(即int64
)。
在讨论intc
时,通常是在特定的编程语境下,比如在某些编程语言或库中,可能会特别指出intc
来强调其与C语言中int
类型的对应关系。例如,在NumPy这样的数值计算库中,intc
被用来表示一个整数类型,它在底层与C语言中的int
类型相对应,这意味着它可以用来表示的整数范围与C语言中的标准int
类型相同。
总结来说,intc
是在某些编程环境中用来指代与C语言标准int
类型相对应的整数类型,它通常是32位或64位的,具体取决于系统或编译器的实现。
2、intp
intp
是用于索引的整数类型,通常相当于C语言中的size_t
类型,它可以是32位或64位的整数。
在编程中,intp
通常用于数组索引、循环计数等场景,它的目的是提供足够的范围来表示大多数索引和大小。在不同的编程环境中,intp
的具体实现可能有所不同,但它通常与C语言中的size_t
类型相对应,这是因为size_t
类型被设计用来表示对象的大小,而这对于数组索引和内存分配等操作是非常有用的。
此外,intp
的长度(即32位或64位)取决于特定的系统和编译器。在32位系统中,intp
通常是32位的,而在64位系统中,它通常是64位的。这与C语言中的int
类型相似,int
类型在不同系统中也可能有不同的长度。
总的来说,了解intp
的类型和用途对于编写高效且可移植的代码非常重要,尤其是在处理数组和内存管理时。
C语言中的size_t
类型是一个无符号整数类型,用于表示对象的大小。以下是size_t
类型的详细说明:
- 类型定义:
size_t
是一个无符号整数类型,它在C标准库中定义,通常用于表示对象的大小。 - 作用:
size_t
类型主要用于提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。例如,它被用作malloc
函数的参数类型,以指定分配内存的大小。 - 可移植性:
size_t
的大小足以保证存储内存中对象的大小,其具体类型取决于操作系统和系统架构。在32位系统中,size_t
通常是unsigned int
,而在64位系统中则可能是unsigned long
。 - 使用场景:
size_t
类型经常出现在C和C++标准库中,用于函数如memcpy
、strlen
等的参数或返回值类型,以确保这些函数能够正确地处理不同系统上的对象大小。
综上所述,size_t
是C语言中一个非常重要的数据类型,它为编程提供了一种跨平台的方式来处理与内存大小相关的操作。
3、浮点数的指数、尾数
半精度浮点数(float16)是一种用更少的位来表示数值的浮点数格式,它使用5位来表示指数部分,而尾数部分则使用10位。
具体来说,一个浮点数通常由三个部分组成:符号位、指数部分和尾数部分。对于半精度浮点数(float16):
- 符号位:1位,用于表示正负号;
- 指数位:5位,用于表示2的幂次;
- 尾数位:10位,用于表示小数部分。
这种格式与单精度浮点数(float32)相比,后者使用8位指数和23位尾数,以及双精度浮点数(float64)相比,后者使用11位指数和52位尾数,都有更少的位数,因此半精度浮点数在存储空间和计算资源上更为节省。然而,这种节省是以牺牲一定的精度和数值范围为代价的。半精度浮点数的数值范围和精度都小于单精度和双精度浮点数。
在实际应用中,半精度浮点数可以用于那些对精度要求不是特别高,但需要处理大量数据的场合,如某些图像处理、深度学习等领域,以减少内存占用和提高计算效率。
4、 numpy.dtype(object, align, copy)
`numpy.dtype(object, align, copy)` 是用于创建自定义数据类型的函数。
- `object`:指定要创建的数据类型,可以是任何Python对象,如字符串、整数、浮点数等。
- `align`:指定对齐方式,通常为True或False。如果设置为True,则在内存中按照指定的字节对齐方式存储数据;如果设置为False,则不对齐。
- `copy`:指定是否复制已有的数据类型。如果设置为True,则创建一个新的数据类型,与已有的数据类型不共享内存;如果设置为False,则使用已有的数据类型。
例如,创建一个名为`my_dtype`的自定义数据类型,可以这样写:
import numpy as np
my_dtype = np.dtype(np.int32, align=True, copy=False)
这将创建一个名为`my_dtype`的自定义数据类型,该数据类型具有与`np.int32`相同的属性,但在内存中按照指定的字节对齐方式存储数据。
5、
astype()
方法
a.astype(int).dtype
是一个NumPy中的方法链调用,用于将数组a
的数据类型从float64
转换为int
,并查看转换后的dtype
类型。
astype()
方法:这是NumPy数组对象的一个方法,用于执行数组元素的数据类型转换操作。它接受一个参数,这个参数指定了目标数据类型。在执行转换后,astype()
会返回一个新的数组,该数组的元素被转换为指定的类型。需要注意的是,这种转换可能会涉及到数据的改变,例如从浮点数转换为整数时,小数部分会被截断。如果无法进行有效的类型转换,比如将非数字字符串转换为数值类型,那么将会引发异常。dtype
属性:在Python中,通过使用a.dtype
可以查看变量a
的数据类型。这是NumPy数组的一个属性,用于返回数组元素的数据类型,如int
、float
等。当你对数组调用dtype
属性时,它会告诉你数组中元素的确切数据类型。
在这个具体的例子中,a.astype(int).dtype
的执行过程如下:
a.astype(int)
:这部分代码将数组a
中的所有元素从原来的float64
类型转换为int
类型。在这个过程中,原有的浮点数元素将被截断为整数,即舍弃小数部分。.dtype
:这部分代码获取了转换后的数组的数据类型属性。由于之前已经将数组转换为了int
类型,因此这里的dtype
将返回int
。
综上所述,通过使用a.astype(int).dtype
,你不仅能够将数组a
中的元素从一种数据类型转换为另一种数据类型,还能够立即查看转换后的数组元素的确切数据类型。这在需要确保数据类型一致性或进行特定数学计算时非常有用。
6、np.arange
是 NumPy 库中的一个函数,用于生成一个在指定区间内均匀分布的整数序列。
import numpy as np
start = 0 # 起始值,包含在内
stop = 10 # 终止值,不包含在内
step = 1 # 步长
arr = np.arange(start, stop, step)
在上面的例子中,arr
将包含从 0
到 9
的整数,因为 np.arange
包含起始值 0
,但不包含终止值 10
。
如果只传入一个参数,那么它将作为 stop
,起始值默认为 0
,步长默认为 1
:
arr = np.arange(10) # 生成从 0 到 9 的整数序列
传入两个参数,那么第一个参数将作为 start
,第二个参数将作为 stop
:
arr = np.arange(2, 10) # 生成从 2 到 9 的整数序列
np.arange
是科学计算和数据处理中常用的函数之一,常用于生成索引、进行循环控制等。
7、np.ones
np.ones
是 NumPy 库中的一个函数,用于创建一个指定形状和数据类型的新数组,并将其所有元素初始化为 1。
import numpy as np
# 创建一个长度为 5 的一维数组,所有元素都是 1
arr1 = np.ones(5)
# 创建一个 2x3 的二维数组,所有元素都是 1
arr2 = np.ones((2, 3))
# 创建一个 3x4 的三维数组,所有元素都是 1
arr3 = np.ones((3, 4, 5))
np.ones
接受的参数可以是一个整数,也可以是一个元组,用来指定数组的形状。如果只传入一个整数,那么它将创建一个一维数组,其长度就是那个整数。如果传入一个元组,那么元组的每个元素将指定相应维度的长度。
此外,np.ones
还可以接受其他参数,例如 dtype
用于指定数组元素的数据类型,order
用于指定数组的内存布局(‘C’ 表示按行优先,‘F’ 表示按列优先):
# 创建一个 2x3 的二维数组,所有元素都是 1,数据类型为 float
arr4 = np.ones((2, 3), dtype=float)
# 创建一个 2x3 的二维数组,所有元素都是 1,按列优先布局
arr5 = np.ones((2, 3), order='F')
np.ones
与类似的函数 np.zeros
和 np.full
一起,是初始化数组时非常有用的工具。np.zeros
创建所有元素都是 0 的数组,而 np.full
可以创建所有元素都是指定值的数组。
8、np.full
是 NumPy 库中的一个函数,用于创建一个指定形状和数据类型的新数组,并将其所有元素初始化为指定的值。其基本用法如下:
import numpy as np
# 创建一个长度为 5 的一维数组,所有元素都是 7
arr1 = np.full(5, 7)
# 创建一个 2x3 的二维数组,所有元素都是 9.0
arr2 = np.full((2, 3), 9.0)
# 创建一个 3x4 的三维数组,所有元素都是 'a'
arr3 = np.full((3, 4, 5), 'a')
np.full
接受的参数可以是一个整数,也可以是一个元组,用来指定数组的形状。第一个参数指定数组的形状,第二个参数指定填充的值。如果只传入一个整数,那么它将创建一个一维数组,其长度就是那个整数。如果传入一个元组,那么元组的每个元素将指定相应维度的长度。
此外,np.full
还可以接受其他参数,例如 dtype
用于指定数组元素的数据类型,尽管通常情况下,NumPy 会根据填充值的数据类型自动推断出合适的数据类型:
# 创建一个 2x3 的二维数组,所有元素都是 1,数据类型为 int
arr4 = np.full((2, 3), 1, dtype=int)
# 创建一个 2x3 的二维数组,所有元素都是 3.14,数据类型为 float
arr5 = np.full((2, 3), 3.14)
np.full
是初始化数组时非常有用的工具,特别是当你需要创建一个所有元素都相同的数组时。
np.zeros和ones同理。
9、a.strides
ndarray.strides
用来遍历数组时,输出每个维度中步进的字节数组。
- 在行方向上(第一个维度),需要跳过 12 个字节来到达下一行。
- 在列方向上(第二个维度),需要跳过 4 个字节来到达下一列。
1 维数组可以被看作数学中的向量,2 维数组可以看作是矩阵,而 3 维数组则是一个数据立方。
10、a = np.ones((1, 2, 3))
在NumPy中,数组的维度是由其形状(shape)决定的,而形状是一个表示数组在每个维度上大小的元组。当你创建一个数组时,你可以指定一个形状来告诉NumPy你想要的数组的大小。
例如,当你执行 a = np.ones((1, 2, 3))
时,你正在创建一个三维数组,其形状是 (1, 2, 3)
。这个形状元组中的每个数字代表数组在该维度上的大小:
- 第一个数字
1
表示第一个维度(通常称为“页”或“深度”)的大小为 1。 - 第二个数字
2
表示第二个维度(通常称为“行”)的大小为 2。 - 第三个数字
3
表示第三个维度(通常称为“列”)的大小为 3。
因此,这个数组可以被视为一个包含 1 页的“书”,每页有 2 行 3 列的数字。由于第一个维度的大小是 1,这个数组实际上是一个三维数组的最简单形式,它只有一个二维数组作为其元素。
在NumPy中,数组的维度数量没有限制,你可以创建任意维度的数组,只要形状元组中的元素数量与所需的维度数量相匹配。例如,一个形状为 (2, 3)
的数组是一个二维数组,因为它有两个维度:行和列。一个形状为 (2, 3, 4, 5)
的数组是一个四维数组,依此类推。
11、np.moveaxis(a, 0, -1)
在NumPy中,np.moveaxis
函数用于改变数组的轴的顺序。这个函数接受两个主要的参数:第一个参数是原始数组,第二个参数是一个元组,它指定了轴的原始位置和目标位置。
在你提供的例子中,a = np.ones((1, 2, 3))
创建了一个三维数组,其形状为 (1, 2, 3)
。这意味着这个数组有 1 个“页”,每页有 2 行和 3 列。
然后,np.moveaxis(a, 0, -1)
调用将数组 a
的第一个轴(索引为 0 的轴,即“页”轴)移动到数组的最后一个位置(索引为 -1 的位置)。这样,原本的第一个轴变成了最后一个轴,数组的形状从 (1, 2, 3)
变成了 (2, 3, 1)
。