原文链接: Python numpy 自定义函数和下标选取
下一篇: Python even 线程通讯
自定义函数生成数组
将数组元素的坐标传给自定义函数
a = np.fromfunction(lambda x: x * 2, (6,))
print(a)
def fun(i, j):
return (i + 1) * (j + 1)
a = np.fromfunction(fun, (4, 4))
print(a)
[ 0. 2. 4. 6. 8. 10.]
[[ 1. 2. 3. 4.]
[ 2. 4. 6. 8.]
[ 3. 6. 9. 12.]
[ 4. 8. 12. 16.]]
可以使用数组作为下标读取,返回对应位置的数据
# 使用数组读取
a = np.arange(10)
print(a[[7, 3, 5, 1]]) # [7 3 5 1]
使用bool数组作为下标,返回值为true的数据
a = np.random.randint(0, 10, 6)
print(a)
# a中比5大的数据
print(a[a > 5])
[8 6 6 5 2 7]
[8 6 6 7]
类似切片的语法和数组下标结合
a = np.arange(12).reshape(3, 4)
print(a)
print(a[[1, 0, 2], [3, 1, 2]])
print(a[2:, [2, 1]])
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[ 7 1 10]
[[10 9]]
扩维的方式,只能使用np的array数组作为下标时才能扩维,否则还是按照数组下标读取指定位置的元素
x = [[0, 1], [1, 0]]
print(a[x]) # [1 4]
x = np.array([
[0, 1], [1, 0]
])
# 不指定第一轴的下标时,默认使用:,即会得到三维数组
# [[[0 1 2 3]
# [4 5 6 7]]
#
# [[4 5 6 7]
# [0 1 2 3]]]
print(a[x])
[1 4]
[[[0 1 2 3]
[4 5 6 7]]
[[4 5 6 7]
[0 1 2 3]]]
可以用于图像处理函数
# 处理图像,将图像经过调色数组变为彩色
image = np.array([
[0, 0, 0],
[255, 0, 0],
[0, 255, 0],
[0, 0, 255],
[255, 255, 255]
])
palette = np.array([
[0, 1, 2, 0],
[0, 3, 4, 0],
])
print(image[palette])
[[[ 0 0 0]
[255 0 0]
[ 0 255 0]
[ 0 0 0]]
[[ 0 0 0]
[ 0 0 255]
[255 255 255]
[ 0 0 0]]]
numpy 实现 快速平方根倒数算法
使用移位和逻辑位运算实现,注意view会共享变量内存,所以会修改其指向的数据
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(.1, 30, 100, dtype=np.float32)
# 直接计算
y = 1 / np.sqrt(x)
x2 = x / 2
i = x.view(np.int32)
# 会修改x中的内容
i[:] = 0x5f3759df - (i >> 1)
y2 = y * (1.5 - x2 * x * x)
# 重新计算x,并绘图比较
x = np.linspace(.1, 30, 100, dtype=np.float32)
plt.plot(x, y, 'r')
plt.plot(x, y2, 'b')
plt.show()