当前位置: 首页 > 面试题库 >

numpy复发

史意致
2023-03-14
问题内容

有没有办法在numpy中不使用for来进行复发?

使用np.addwithout关键字可以解决问题dtype="int"

import numpy as np
N = 100

fib = np.zeros(N, dtype=np.int)
fib[:2] = 1.
np.add(fib[:-2], fib[1:-1], out=fib[2:])

print(fib[:10])

输出: [ 1 1 2 3 5 8 13 21 34 55]

但是,如果dtype更改为np.float

import numpy as np
N = 100

fib = np.zeros(N, dtype=np.float)
fib[:2] = 1.
np.add(fib[:-2], fib[1:-1], out=fib[2:])

print(fib[:10])

输出: [ 1. 1. 2. 1. 3. 1. 4. 1. 5. 1.]

有人可以告诉我为什么吗?或任何其他方式进行递归?


问题答案:

这是使用scipy过滤器的一种相当有效的方法:

import numpy as np
from scipy import signal

def scipy_fib(n):
    x = np.zeros(n, dtype=np.uint8)
    x[0] = 1

    sos = signal.tf2sos([1], [1, -1, -1])
    return signal.sosfilt(sos, x)

(请注意,lfilter由于信号处理这是一个不稳定的过滤器,导致Python解释器崩溃,因此我们不能使用它,因此我们必须转换为二阶节形式。)

过滤方法的问题在于我不确定是否可以将其推广到解决ODE的实际问题。

另一个解决方案是简单地用Python编写循环并使用JIT编译器对其进行加速:

import numba as nb

@nb.jit(nopython=True)
def numba_fib(n):
    y = np.empty(n)
    y[:2] = 1

    for i in range(2, n):
        y[i] = y[i-1] + y[i-2]

    return y

JIT方法的优点是您可以实现各种花哨的东西,但是如果坚持使用简单的循环和分支而不调用任何(非JITted)Python函数,则效果最佳。

计时结果:

# Baseline without JIT:
%timeit numba_fib(10000)  # 100 loops, best of 3: 5.47 ms per loop

%timeit scipy_fib(10000)  # 1000 loops, best of 3: 719 µs per loop
%timeit numba_fib(10000)  # 10000 loops, best of 3: 33.8 µs per loop

# For fun, this is how Paul Panzer's solve_banded approach compares:
%timeit banded_fib(10000)  # 1000 loops, best of 3: 1.33 ms per loop

scipy过滤器方法比纯Python循环快,但比JITted循环慢。我猜想filter函数是相对通用的,它可以完成我们不需要的东西,而JITted循环则可以编译成很小的循环。



 类似资料:
  • 这在numpy编码中是什么意思,?你有一个数组,你运行它的形状,它给你这个答案。这是什么意思?

  • 问题内容: 我想创建一个1D NumPy数组,该数组由另一个1D数组的1000个背对背重复组成,而无需将数据复制1000次。 可能吗? 如果有帮助,我打算将两个数组都视为不可变的。 问题答案: 你做不到 NumPy数组在每个维度上必须具有一致的步幅,而您的步幅在大多数情况下需要采用一种方式,但有时会向后跳。 您可以获得的最接近的结果是一个1000行的2D数组,其中的每一行都是您第一个数组的视图,或

  • 问题内容: 当我进行切片时,发生了意外的事情,似乎第一个出现在视图中,而第二个是复制。 第一 首先是行的切片,然后是列的切片。看来是一个看法。 第二 但是,如果我先是列的一部分,然后是行的一部分,那似乎是一个副本: 我很困惑,因为这两种方法最终将导致似乎位置发生变化,但是为什么第二种方法实际上并没有改变数字? 问题答案: 重要的是要按行还是按列切片。按行切片可以返回视图,因为它是原始数组的连续段。

  • 我有一个3d numpy数组的形状,我想得到第三维的argmax(从元素中),但我无法完成。例如,假设数组如下所示(此示例不遵循我在代码中使用的形状): 我想得到一个形状数组(150,9,1)(这也是我的情况,与示例无关)。例如,它将是: 当我用0轴和1轴尝试时,我得到了错误的结果。 有没有办法直接计算出来,或者我应该使用for循环遍历每个(9,5)?

  • 问题内容: 如何删除二维数组的重复行? 答案应该如下: 如果有两行相同,那么我想删除一个“重复”行。 问题答案: 您可以使用。由于您需要唯一的行,因此我们需要将它们放入元组: _只是应用到_阵列会导致这样的: 打印出列表中的唯一元素 。因此,将它们放入元组会导致: 打印: 更新 在新版本中,您需要设置

  • 我的df中有3列 如何将其转换为矩阵?我试过了 但这并没有给出一个矩阵