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

为什么我不能在numpy中提升为负数?

丌官炎彬
2023-03-14
问题内容

我正在建模黎曼θ函数:

import numpy as np
def theta(s, n=100):
    a_range = np.arange(2, n + 1)
    return 1 + sum(1/(a_range ** s))

它对否定无效s; 例如theta(-2)导致此错误:

      1 def theta(s, n=100):
      2     a_range = np.arange(1)
----> 3     return 1 + sum(1/(a_range ** s))
      4 
      5 theta(-2)

      ValueError: Integers to negative integer powers are not allowed.

为什么?x^-1应该只是1/x如果我正确地记得我的数学。


问题答案:

在NumPy中,用于选择类似操作的输出a_range ** sdtype的逻辑基于dtype,而不是值。这意味着a_range ** -2必须具有与相同的输出dtype a_range ** 2

numpy.array([2]) ** 2给出整数输出之类的东西很重要,这意味着numpy.array([2]) ** -2必须给出整数或什么都不给出。他们什么也没捡。将整数提高为负整数幂是NumPy中的错误。

如果要浮点输出,请进行浮点输入:

a_range = np.arange(2, n + 1, dtype=float)

要么

a_range = np.arange(2, n + 1).astype(float)

从上面的描述中可能不会想到NumPy的类型规则的一些奇怪方面。一种是对于涉及标量和数组的操作,在使用输入dtypes选择结果dtype之前,实际上可以根据标量的dtype将其dtype降级:

>>> (numpy.array([1], dtype='int8') + numpy.int32(1)).dtype
dtype('int8')
>>> (numpy.array([1], dtype='int8') + numpy.array([1], dtype='int32')).dtype
dtype('int32')

在这里,标量numpy.int32(1)被“降级”到int8,但数组不会降级。(实际上,这不仅比降级为int8还复杂,尤其是对于有符号/无符号处理;有关详细信息,请参见实现。)

其次,当涉及到uint64s时,NumPy突然看起来可以接受负指数:

>>> numpy.arange(5, dtype='uint64') ** -2
__main__:1: RuntimeWarning: divide by zero encountered in power
array([       inf, 1.        , 0.25      , 0.11111111, 0.0625    ])

这是因为NumPy无法找到足够大的整数dtype来容纳uint64值和负值,因此它放弃并将输入强制为浮点数。只要避免使用标量类型“降级”,对于带符号dtype的正指数,可以看到相同的结果:

>>> numpy.arange(5, dtype='uint64') ** numpy.array([2], dtype='int32')
array([ 0.,  1.,  4.,  9., 16.])


 类似资料:
  • 问题内容: 任何人都可以阐明为什么实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。 我理解为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与相比。调用它或类似名称将具有更清晰的语义。 另外,Doubles可以取的最小值是多少?是吗 该文档似乎没有说。 问题答案: IEEE 754格式保留一位用于符号,其余位表示幅度。这意味着它在origo周围是“对称的”(与In

  • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严

  • 我正在尝试用numpy、matplotlib和tkinter创建生活游戏。我计划首先询问用户游戏板上有多少行和列,以及一个单元格活产卵的概率。输入这些信息后,用户将按“生成”按钮开始游戏。但是,只要按下按钮,就会弹出错误:“AttributeError:‘numpy.ndarray’object has no attribute‘set\u canvas’”。我不知道为什么FigureCanvas

  • null null 我在/s/chart/img/purple.png中有一个img,我想在“ChartContainer3”中创建,但我不明白当我单击submit时没有发生任何事情,没有创建。那么我如何在“ChartContainer3”中进行创建呢?

  • 我正在尝试使用文件系统。我的< code>CMakeLists.txt中有< code>-std=c 11 -std=c 1y。GCC版本为4.9.2。然而,我得到了一个错误: 使用的正确方法是什么?

  • 问题内容: 任何人都可以阐明为什么实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。 我理解为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与相比。 调用它或类似名称将具有更清晰的语义。 另外,Doubles可以取的最小值是多少?是-Double.MAX_VALUE吗 该文档似乎没有说。 问题答案: IEEE 754格式保留一位用于符号,其余位表示幅度。这意味着它