目录
- 一、python中变量前面有个*
- 二、numpy.prod
- 三、numpy.savez
- 四、 arr[..., ::-1]
- 五、 yield
- 六、 string.join()
- 七、 numpy.random.choice()
一、python中变量前面有个*
在Python中,变量前面的星号(*)有多种用法,主要与函数参数或解包序列有关。
1、在函数参数中,星号(*)用来表示任意多个参数,这些参数会被当作元组传递。例如:
def fun(*args):for i in args:print(i)fun(1, 2, 3, 4)
2、在函数参数中,星号(*)还可以用来解包序列。例如:
def fun(a, b, c, d):print(a, b, c, d)args = (1, 2, 3, 4)
fun(*args)
3、在函数参数中,星号(*)还可以与命名参数,或者字典一起使用。例如:
def fun(*args, a=1):print(args, a)fun(1, 2, 3, a=4)def fun(*args, **kwargs):print(args, kwargs)fun(1, 2, 3, a=4, b=5)
4、 在解包列表或元组时,星号(*)也可以用来解包选定项。例如:
lst = [1, 2, 3, 4, 5]
a, *b, c = lst
print(a, b, c)
二、numpy.prod
计算元素和
print(np.prod([[1., 2.], [3., 4.]], axis=0))按列计算元素和
print(np.prod([[1., 2.], [3., 4.]], axis=1))按行计算元素和
print(np.prod([[1., 2.], [3., 4.]], axis=0))计算所有元素和
三、numpy.savez
numpy.savez 是 NumPy 库中的一个函数,用于将多个数组保存到以 .npz 为扩展名的文件中。与 numpy.save 函数不同,后者一次只能保存一个数组到一个 .npy 文件中,numpy.savez 允许你一次性保存多个数组,并将它们作为字典的键值对存储在 .npz 文件中。这样做的好处是可以在一个文件中方便地存储和加载多个数组,而不需要为每个数组创建单独的文件。
import numpy as np # 创建一些数组
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([1, 2, 3, 4, 5])
c = np.array([6, 7, 8]) # 使用 savez 保存多个数组
np.savez('my_arrays.npz', a=a, b=b, c=c) # 或者使用 *args 方式,不指定键名(数组变量名将作为键名)
# np.savez('my_arrays_no_keys.npz', a, b, c)
四、 arr[…, ::-1]
在Python中,表达式arr[…, ::-1]通常用于NumPy数组或兼容NumPy索引的数组(如PyTorch张量)上,用于对数组进行切片操作。这个表达式的目的是沿着数组的最后一个维度(或轴)反转元素的顺序。
这里的…是NumPy引入的省略号(ellipsis),它用于表示在指定位置选择多个未明确指出的维度。在这个上下文中,…意味着“选择所有前面的维度”,而::-1是一个切片操作,表示“从末尾开始到开头,步长为-1”,即反转当前维度的元素顺序。
假设我们有一个形状为(3, 4, 3)的三维NumPy数组,代表三个颜色通道(RGB)的图像批次,每个图像的大小为4x3像素。如果我们想要将每个图像的RGB通道顺序更改为BGR,我们可以使用arr[…, ::-1]来实现这一点。
python
import numpy as np # 创建一个形状为(3, 4, 3)的随机数组,模拟RGB图像批次
arr = np.random.randint(0, 256, size=(3, 4, 3), dtype=np.uint8) # 打印原始数组的形状和一部分内容
print("Original shape:", arr.shape)
print("Original array (first image):\n", arr[0]) # 使用arr[..., ::-1]反转最后一个维度(颜色通道)
arr_bgr = arr[..., ::-1] # 打印反转后数组的形状和一部分内容
print("Modified shape:", arr_bgr.shape) # 形状保持不变
print("Modified array (first image, now in BGR):\n", arr_bgr[0])
在这个例子中,arr[…, ::-1]会保持数组的形状不变(因为我们只反转了最后一个维度),但是会改变最后一个维度的元素顺序,从而将RGB通道更改为BGR通道。
这种操作在处理图像数据时非常有用,因为不同的图像处理库和框架可能期望不同的颜色通道顺序。例如,OpenCV默认使用BGR顺序,而PIL(Python Imaging Library)和matplotlib则使用RGB顺序。
五、 yield
在Python中,yield 关键字用于从函数中返回一个生成器(generator)。生成器是一个可以记住上一次返回位置的对象,并在下一次迭代时从该位置继续执行。这使得它们非常适合用于需要逐个处理大量数据的场景,因为它们可以按需生成数据,从而节省内存。
当你调用一个包含 yield 的函数时,该函数不会立即执行其代码,而是返回一个迭代器(即生成器)。然后,你可以通过迭代这个生成器来逐步执行函数中的代码。每次迭代时,yield 语句会“暂停”函数的执行,并返回紧随其后的值给迭代器的调用者。当迭代器再次请求下一个值时,函数会从上次暂停的位置继续执行,直到遇到下一个 yield 语句或函数结束。
下面是一个简单的使用 yield 的例子,该函数生成一个斐波那契数列(Fibonacci sequence):
python
def fibonacci(n): a, b = 0, 1 count = 0 while count < n: yield a a, b = b, a + b count += 1
for num in fibonacci(10): print(num)
在这个例子中,fibonacci 函数是一个生成器函数,它使用 yield 来逐个返回斐波那契数列中的数。当我们使用 for 循环迭代 fibonacci(10) 时,函数会在每次迭代时执行到下一个 yield 语句,并返回当前的 a 值。当函数内部的状态(即 a 和 b 的值以及 count)被保存起来,并在下一次迭代时恢复,直到生成了 n 个数为止。
注意事项:
使用 yield 的函数会返回一个生成器对象,而不是一次性返回所有值。
生成器只能迭代一次。一旦生成器迭代完成,它就不能再次从头开始迭代。
生成器非常适合用于实现迭代器协议,因为它们提供了惰性求值(lazy evaluation)的能力,即只有在需要时才计算值。
在生成器中,return 语句会立即停止迭代,但可以通过 return 语句返回一个值给迭代器的 StopIteration 异常(在Python 3.3及以后版本中,如果生成器因为 return 语句而终止,则 return 语句后的值(如果有的话)会被用作 StopIteration 异常的 value 属性)。如果生成器中没有 return 语句,或者 return 语句没有值,则迭代会在自然结束时停止。
六、 string.join()
在Python中,string.join() 方法用于将序列(如列表、元组)中的元素以指定的字符连接生成一个新的字符串。
separator = ', '
sequence = ['apple', 'banana', 'cherry']
result = separator.join(sequence)
print(result) # 输出: apple, banana, cherry
七、 numpy.random.choice()
np.random.choice 是 NumPy 库中的一个函数,用于从给定的一维数组中随机抽取元素。这个函数非常灵活,允许你指定抽取元素的数量、是否允许替换(即重复抽取同一元素)以及根据给定的概率分布进行抽取。
numpy.random.choice(a, size=None, replace=True, p=None)
参数:
a:一维数组或整数。如果是一维数组,则从该数组中抽取元素;如果是整数,则在该整数的范围内(0 到 a-1)抽取整数。
size:整数或整数元组。表示输出的形状。如果给定,则输出数组的形状将是 size,否则输出一个元素或一个数组(如果 replace=False 且 a 的长度小于 size,则可能引发错误)。
replace:布尔值。如果为 True,则从数组中随机抽取元素,允许替换(即可以重复抽取同一元素)。如果为 False,则进行不放回抽样。
p:一维数组。与 a 的长度相同,表示从 a 中抽取每个元素的概率。这些概率不需要归一化,因为 np.random.choice 会自动进行归一化。但是,如果 p 的总和不为 1(在浮点数精度范围内),则会引发警告。
返回值是一个数组,其形状由 size 参数指定,包含了从 a 中根据 p(如果提供)指定的概率分布随机抽取的元素。