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

NumPy数组上带有+ =的意外结果

嵇星海
2023-03-14
问题内容

我正在使用NumPy在Python中使用标准方法创建对称矩阵/数组:

x = rand(500,500)
x = (x+x.T)
all(x==x.T)
> True

现在让我们变得聪明:

x = rand(500,500)
x += x.T
all(x==x.T)
> False

等一下

x==x.T
> array([[ True,  True,  True, ..., False, False, False],
       [ True,  True,  True, ..., False, False, False],
       [ True,  True,  True, ..., False, False, False],
       ..., 
       [False, False, False, ...,  True,  True,  True],
       [False, False, False, ...,  True,  True,  True],
       [False, False, False, ...,  True,  True,  True]], dtype=bool)

左上和右下部分是对称的。如果我选择了较小的阵列怎么办?

x = rand(50,50)
x += x.T
all(x==x.T)
> True

好....

x = rand(90,90)
x += x.T
all(x==x.T)
> True

x = rand(91,91)
x += x.T
all(x==x.T)
> False

只是要确保…

x = rand(91,91)
x = (x+x.T)
all(x==x.T)
> True

这是一个错误,还是我要学习一些有关+=NumPy数组的疯狂知识?


问题答案:

transpose操作返回该数组的
视图
,这意味着未分配新数组。反过来,这意味着您正在同时读取和修改阵列。很难说出为什么某些大小或结果区域起作用的原因,但是最有可能与numpy处理数组加法(也许是制作子矩阵的副本)和/或数组视图(也许是它创建的小尺寸)有关。一个新数组)。

x = x + x.T操作之所以有效,是因为您在那里在那里创建了一个新数组,然后将其分配给x



 类似资料:
  • 问题内容: 我正在使用arange函数来定义for循环迭代并获得意外结果。 满足以下条件: 仍使用8.35的停止值,如下所示 产生以下 但是我希望我的射程结束于8.35!我知道我可以使用> 8.35和<8.4的止损值来获得我的结果,但是为什么它与众不同并且在我看来不一致? 编辑:我正在使用2.7版 问题答案: 也许这与浮点数的限制有关。由于机器的精度,不可能将所有可能的值完美地存储为浮点数。例如:

  • 问题内容: 给定以下示例: 输出为: 为什么? 问题答案: 这是因为前导零的整数文字是八进制整数(以8为底):

  • 问题内容: 当以某种出乎意料的方式执行特定切片时,numpy数组的形状正在改变 我尝试了将同一阵列切成薄片的几种方法,但是细微的差异会导致阵列形状的结果不同 在最后两个示例中,我不明白为什么最后一个轴移动到第一个位置。 我使用与 问题答案: 在最后两种情况下可能会发现结果出乎意料的原因是,即使您也使用切片进行索引,但数组的索引仍遵循高级索引的规则。 有关此行为的详细说明,您可以检查结合使用高级索引

  • 问题内容: 我在大型代码中发现了一个错误,并将问题简化为以下情况。 尽管在每一步中我都只更改,但是在每一步中我都打印时,它也会更改,因为在第一循环的结尾我将它们分配为相等。我读过这篇文章,但是写了一些,以防我能解决问题,但事实并非如此 问题答案: 问题是,当您将值从分配回时,您实际上并没有将值从传递给,而是实际上是将两个变量指向 同一对象 。 您遇到的问题 解决方案 相反,您将需要复制 值 。使用

  • 问题内容: 小数dtype是否在numpy中可用? 我想numpy.array并不支持每个dtype,但是我认为只要定义正确的操作,它至少可以让dtype传播到尽可能远的距离。我想念什么吗?有什么办法可以工作吗? 问题答案: 重要提示:这是一个糟糕的答案 所以我在真正理解问题之前回答了这个问题。答案已被接受,并且有一些支持,但您最好跳至下一个。 原始答案: 似乎可用: 我不确定您要完成的工作,您的

  • 我做了一个练习,将某些数字提升到给定的幂。正是我遇到的问题: 我们使用整数a、b和n来创建以下序列: 将以a、b和n的形式为您提供q查询。对于每个查询,将与给定a、b和n值对应的序列打印为一行由n个空格分隔的整数。 输入格式 第一行包含一个整数q,表示查询的数量。q后续行的每一行i都包含三个空格分隔的整数,描述该查询的相应ai、bi和ni值。 输出格式 对于每个查询,在新行上打印相应的序列。每个系