小编acd*_*cdr的帖子

自定义链式比较

Python允许使用类似的表达式x > y > z,根据文档,这些表达式相当于(x > y) and (y > z)除了y只计算一次.(https://docs.python.org/3/reference/expressions.html)

但是,如果我自定义比较功能,这似乎会中断.例如,假设我有以下类:(对于大块的道歉,但是一旦你阅读了这个__eq__方法,其余的都是微不足道的.)

class CompareList(list):
    def __repr__(self):
        return "CompareList([" + ",".join(str(x) for x in self) + "])"

    def __eq__(self, other):
        if isinstance(other, list):
            return CompareList(self[idx] == other[idx] for idx in xrange(len(self)))
        else:
            return CompareList(x == other for x in self)

    def __ne__(self, other):
        if isinstance(other, list):
            return CompareList(self[idx] != other[idx] for idx in xrange(len(self)))
        else:
            return CompareList(x != other for x …
Run Code Online (Sandbox Code Playgroud)

python

16
推荐指数
1
解决办法
347
查看次数

如何使用切片赋值扩展此列表?

我遇到了以下代码(有点):

my_list = [1, [2, 3, 4], 5]
my_list[1:2] = my_list[1]
Run Code Online (Sandbox Code Playgroud)

运行这两行后,变量my_list将是[1, 2, 3, 4, 5].对扩展嵌套列表非常有用.

但为什么它实际上做它做的事情呢?

我会假设该声明my_list[1:2] = my_list[1]将执行以下操作之一:

  • 简单地放入[2, 3, 4]列表中的第二个位置(它已经存在)
  • 从尝试将三个值(即2,3,4)放入仅长度为1(即my_list[1:2])的容器中,给出某种"解压缩的值太多"错误.(使用Numpy数组而不是列表重复上述操作会导致类似的错误.)

其他问题(例如,赋值如何与python列表切片一起使用)往往不太注意要替换的切片大小与要替换它的项目的大小之间的差异.(更别说解释它为什么会这样运作了.)

python

12
推荐指数
1
解决办法
984
查看次数

在dtype"object"数组上的np.isnan

我正在使用不同数据类型的numpy数组.我想知道,在任何特定数组中,哪些元素是NaN.通常,这np.isnan是为了什么.

但是,np.isnan对数据类型数组object(或任何字符串数据类型)不友好:

>>> str_arr = np.array(["A", "B", "C"])
>>> np.isnan(str_arr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Not implemented for this type

>>> obj_arr = np.array([1, 2, "A"], dtype=object)
>>> np.isnan(obj_arr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' …
Run Code Online (Sandbox Code Playgroud)

python numpy

9
推荐指数
2
解决办法
3432
查看次数

快速算法查找多个数组具有相同值的索引

我正在寻找加速(或替换)我的算法来分组数据的方法.

我有一个numpy数组列表.我想生成一个新的numpy数组,这样对于原始数组也相同的每个索引,这个数组的每个元素都是相同的.(如果不是这样的话会有所不同.)

这听起来有点尴尬,所以有一个例子:

# Test values:
values = [
    np.array([10, 11, 10, 11, 10, 11, 10]),
    np.array([21, 21, 22, 22, 21, 22, 23]),
    ]

# Expected outcome: np.array([0, 1, 2, 3, 0, 3, 4])
#                             *           *
Run Code Online (Sandbox Code Playgroud)

请注意,我标记的元素(索引0和4)具有相同的值(0),因为原始的两个数组也是相同的(即1021).类似于索引为3和5(3)的元素.

该算法必须处理任意数量(大小相等)的输入数组,并且还为每个结果数返回它们对应的原始数组的值.(因此对于这个例子,"3"指的是(11, 22).)

这是我目前的算法:

import numpy as np

def groupify(values):
    group = np.zeros((len(values[0]),), dtype=np.int64) - 1 # Magic number: -1 means ungrouped.
    group_meanings = {}
    next_hash = 0
    matching = np.ones((len(values[0]),), dtype=bool)
    while …
Run Code Online (Sandbox Code Playgroud)

python performance numpy

7
推荐指数
1
解决办法
1021
查看次数

检查两个numpy数组是否相同

假设我有一堆数组,包括xy,我想检查它们是否相等.一般来说,我可以使用np.all(x == y)(除非我现在忽略了一些愚蠢的角落案例).

但是,这会评估整个数组(x == y),这通常是不需要的.我的阵列是真的大了,我有很多的人,和两个数组是相等的小,所以在所有的可能性,我真的只需要评估的一个非常小的一部分的可能性(x == y)之前,all函数可以返回False,所以这对我来说不是最佳解决方案.

我尝试过使用内置all函数,结合itertools.izip:all(val1==val2 for val1,val2 in itertools.izip(x, y))

不过,这似乎只是在两个数组的情况下慢得多相等的,即总体而言,它使用过的STIL不值得np.all.我认为是因为内置all的一般目的.而且np.all不会对发电机工作.

有没有办法以更快的方式做我想要的事情?

我知道这个问题类似于先前提出的问题(例如,比较两个numpy数组的相等性,元素方面),但它们没有特别涵盖提前终止的情况.

python numpy

7
推荐指数
1
解决办法
3988
查看次数

Python照片马赛克与抽象形状的马赛克

图像镶嵌图使用一组预定义的平方图像来构建更大的图像(例如此处).有很多解决方案,实现这种效果是非常微不足道的.但是,由于以下限制,它变得更加困难:

  1. 原始马赛克的形状是抽象的.任何凸多边形都可以.
  2. 每个马赛克只能使用一次.
  3. 没有必要将马赛克完全打包(即占据画布的100%),但它们应尽可能不重叠.

我试图使古老的镶嵌艺术自动化,特别是Opus palladianum技术.

我的想法是使用模拟退火或其他一些启发式来优化每个不规则马赛克的位置和旋转,在每次迭代中交换两个,试图最小化一些反映与目标图像的相似性的能量函数以及" 包装 "瓷砖.我试图在python中实现这一点,任何想法和帮助将不胜感激.

例:

在此输入图像描述

python image photographic-mosaic

7
推荐指数
1
解决办法
814
查看次数

随机:默认种子是什么?

对于 Python 3,我可以在互联网上找到许多不同的地方,说明random模块的默认种子基于系统时间。

Python 2.7 也是这种情况吗?我想是的,因为如果我启动两个不同的 Python 进程,并且在这import random; random.random()两个进程中我都这样做,那么这两个不同的进程会返回不同的结果。

如果它确实使用系统时间,那么实际使用的种子是什么?(例如“自午夜以来的秒数”或“自 UNIX 纪元以来的微秒数”,或者……)如果不是,那么用什么来播种 PRNG?

python python-2.7

7
推荐指数
1
解决办法
5592
查看次数

为什么Python没有"__req__"(反映相等)方法?

我有一个小助手班:

class AnyOf(object):
    def __init__(self, *args):
        self.elements = args
    def __eq__(self, other):
        return other in self.elements
Run Code Online (Sandbox Code Playgroud)

这让我做了甜蜜的魔术:

>>> arr = np.array([1,2,3,4,5])
>>> arr == AnyOf(2,3)
np.array([False, True, True, False, False])
Run Code Online (Sandbox Code Playgroud)

无需使用列表理解(如np.array(x in (2,3) for x in arr).

(我维护一个让(可信)用户输入任意代码的用户界面,并且a == AnyOf(1,2,3)比非技术精明用户的列表理解更加可口.)

然而!

这只适用于一种方式!例如,如果我这样做,AnyOf(2,3) == arr那么我的AnyOf类的__eq__方法永远不会被调用:相反,NumPy数组的__eq__方法被调用,在内部(我会假设)调用其__eq__所有元素的方法.

这让我想知道:为什么Python不允许右侧等效__eq__?(大致相当于像__radd__,__rmul__等等的方法.)

python numpy python-datamodel python-internals

6
推荐指数
2
解决办法
341
查看次数

禁用matplotlib的默认箭头键绑定

使用matplotlib的mpl_connect功能,可以将事件绑定到函数调用。但是,默认情况下,向左和向右箭头键在图形的历史记录中必然会“返回”和“前进”。我想禁用此默认绑定。

例如:

import matplotlib.pyplot as plt

def on_key_press(event):
    if event.key == "left":
        print("Left!")
    elif event.key == "right":
        print("Right!")

plt.plot([0, 1, 2, 3, 4], [5, 2, 1, 2, 5])
plt.gcf().canvas.mpl_connect("key_press_event", on_key_press)
Run Code Online (Sandbox Code Playgroud)

现在按左键将打印Left!到控制台。但是,当我们放大图中时,左键也将“返回”并缩小。(右键将“前进”并放大。)我希望这种情况不会发生-我该怎么做?获得on_key_press回报False并不能解决问题。

(背景信息:我已经设置了绑定,因此,当用户单击图形时,将出现一个光标,以绘制点为中心(由[0,1,2,3,4]和[5,2给定,1,2,5]),最接近用户单击的位置。我可以使左右键将光标移动到上一个/下一个数据点,但是如果用户恰好被放大或做了任何操作,对图进行其他操作,情况就会变糟。)

python matplotlib

5
推荐指数
1
解决办法
878
查看次数

psycopg2:使用什么 page_size

我正在将大量记录写入 postgres 数据库,使用 psycopg2.extras.execute_values(cursor, query, data, page_size=100)

我知道page_size参数的作用,但真的不知道将它设置为什么是合理的值。(以上使用默认值 100。)简单地将其设置为大得离谱的值有什么缺点?

python psycopg2

5
推荐指数
1
解决办法
1558
查看次数