Python numpy 自定义函数和下标选取

原文链接: Python numpy 自定义函数和下标选取

上一篇: tf rnn 延时序列 滚动序列和反转序列

下一篇: 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会共享变量内存,所以会修改其指向的数据

815d8583529f670e494879fec837766e75c.jpg

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值