在本文中,我们将带你了解numpy数组中的整数溢出在这篇文章中,我们将为您详细介绍numpy数组中的整数溢出的方方面面,并解答numpy整数数组常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效
在本文中,我们将带你了解numpy数组中的整数溢出在这篇文章中,我们将为您详细介绍numpy数组中的整数溢出的方方面面,并解答numpy 整数数组常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的c语言中的整数溢出问题、Java中的整数溢出、numpy数组中的多个累积和、numpy数组中的自定义数据类型。
本文目录一览:numpy数组中的整数溢出(numpy 整数数组)
import numpy as npa = np.arange(1000000).reshape(1000,1000)print(a**2)
有了这段代码,我得到了这个答案。为什么我得到负值?
[[ 0 1 4 ..., 994009 996004 998001] [ 1000000 1002001 1004004 ..., 3988009 3992004 3996001] [ 4000000 4004001 4008004 ..., 8982009 8988004 8994001] ..., [1871554624 1873548625 1875542628 ..., -434400663 -432404668 -430408671] [-428412672 -426416671 -424420668 ..., 1562593337 1564591332 1566589329] [1568587328 1570585329 1572583332 ..., -733379959 -731379964 -729379967]]
答案1
小编典典在您的平台上,np.arange返回dtype’int32’的数组:
In [1]: np.arange(1000000).dtypeOut[1]: dtype(''int32'')
数组的每个元素都是32位整数。平方导致结果不适合32位。结果被裁剪为32位,并且仍然解释为32位整数,这就是为什么看到负数的原因。
编辑: 在这种情况下,可以通过在平方之前构造dtype’int64’数组来避免整数溢出:
a=np.arange(1000000,dtype=''int64'').reshape(1000,1000)
请注意,使用numpy时,发现的问题是固有的危险。您必须谨慎选择dtype,并事先知道您的代码不会导致算术溢出。为了速度起见,numpy不能也不会在出现这种情况时警告您。
有关numpy邮件列表上对此的讨论,请参见http://mail.scipy.org/pipermail/numpy-
discussion/2009-April/041691.html。
c语言中的整数溢出问题
1、以以下程序为例:
#include <stdio.h> int main(void) { int i = 2147483647; //int类型可以表示的数值范围为 -2147483648 ~ 2147483647 unsigned int j = 4294967295; //unsigned int的取值范围为0 ~ 4294967295 printf("%d %d %d\n", i, i + 1, i + 2); printf("%u %u %u\n", j, j + 1, j + 2); return 0; }
//运行结果显示,当数值超过数据类型可以表示的最大范围时,数值会从头开始,比如i为 2147483648将从头显示-2147483648,
//j超过其最大可以表示的范围4294967295时,将从0开始表示超出的数值。
Java中的整数溢出
我被要求计算数字x1,x2,x3,… xn的平均值
class Iterator { bool hasNext; int getNext(); }
//所以它归结为这样的事情:
double average (Iterator & it) { double average = 0; double sum = 0; int len = 0; while (it.hasNext == true) { sum += it.getNext(); } if (len > 0) average = sum / len; }
采访者说清单大小不明,而且可能非常大,所以总和可能会溢出.他问我如何解决溢出问题,我通过跟踪我们如何超过最大数量等来回答,他说了一些关于推入堆栈的事情,平均值和长度,我从来没有真正理解他的解决方案通过推动这些2变量成某种列表?有人有线索吗?
解决方法
假设您已经平均了n – 1个项目,并且您在oldAvg中有平均值.
oldAvg =(x1 x2 .. xn – 1)/(n – 1)
新的平均值将由newAvg表示:
newAvg =(x1 x2 .. xn – 1 xn)/ n
通过一些代数操作,我们可以使用旧平均值表示平均值的新平均值,以及下一个项目.
newAvg =(x1 x2 .. xn – 1)/ n xn / n
=((n – 1)/(n – 1))*(x1 x2 .. xn – 1)/ n xn / n
= oldAvg / n *(n – 1)xn / n
这可以通过在乘以n-1之前除以n来避免溢出.然后,您只需要添加下一个项xn,除以n.
第一个循环将平均值设置为等于第一个元素,但每个后续循环将使用上面的公式来推导新的平均值.
n++; newAvg = oldAvg / n * (n - 1) + it.next() / n;
numpy数组中的多个累积和
我是numpy的新手,如果对此问题已经提出,我感到抱歉。我正在寻找一种矢量化解决方案,该解决方案可以在一维numpy数组中运行多个不同大小的累加器。
my_vector=np.array([1,2,3,4,5])
size_of_groups=np.array([3,2])
我想要类似的东西
np.cumsum.group(my_vector,size_of_groups)
[1,6,9]
我不想使用循环的解决方案。numpy函数或numpy操作。
numpy数组中的自定义数据类型
我正在创建一个numpy数组,该数组将填充我制作的特定类的对象。我想初始化数组,使其仅包含该类的对象。例如,这是我想做的事,如果我做这件事会发生什么。
class Kernel: pass>>> L = np.empty(4,dtype=Kernel)TypeError: data type not understood
我可以做这个:
>>> L = np.empty(4,dtype=object)
然后将的每个元素分配L
为一个Kernel
对象(或任何其他类型的对象)。Kernel
从编程的角度(类型检查)和数学的角度(对函数集进行操作)的角度来看,如果我能够拥有一个s数组,那将是如此的巧妙。
我可以使用任意类指定numpy数组的数据类型吗?
答案1
小编典典如果您的内核类具有可预测的成员数据量,则可以为其定义dtype而不是类。例如,如果它由9个浮点数和一个int参数化,则可以
kerneldt = np.dtype([(''myintname'', np.int32), (''myfloats'', np.float64, 9)])arr = np.empty(dims, dtype=kerneldt)
每当您要操作单个内核的方法时,都必须进行强制转换才能将它们转换为Kernel类的对象,但这是将实际数据存储在NumPy数组中的一种方法。如果只想存储一个引用,则对象dtype是最好的,而无需将ndarray子类化。
今天关于numpy数组中的整数溢出和numpy 整数数组的讲解已经结束,谢谢您的阅读,如果想了解更多关于c语言中的整数溢出问题、Java中的整数溢出、numpy数组中的多个累积和、numpy数组中的自定义数据类型的相关知识,请在本站搜索。
本文标签: