小编Emm*_*mma的帖子

将2D numpy数组转换为结构化数组

我正在尝试将二维数组转换为带有命名字段的结构化数组.我希望2D数组中的每一行都是结构化数组中的新记录.不幸的是,我所尝试的一切都没有按照我的预期进行.

我开始时:

>>> myarray = numpy.array([("Hello",2.5,3),("World",3.6,2)])
>>> print myarray
[['Hello' '2.5' '3']
 ['World' '3.6' '2']]
Run Code Online (Sandbox Code Playgroud)

我想转换为看起来像这样的东西:

>>> newarray = numpy.array([("Hello",2.5,3),("World",3.6,2)], dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[('Hello', 2.5, 3L) ('World', 3.6000000000000001, 2L)]
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

>>> newarray = myarray.astype([("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
 [('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]

>>> newarray = numpy.array(myarray, dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
 [('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', …
Run Code Online (Sandbox Code Playgroud)

python numpy

33
推荐指数
3
解决办法
2万
查看次数

在python中捕获对可变属性的更改

我每次对属性进行更改时都使用属性来执行某些代码,如下所示:

class SomeClass(object):
    def __init__(self,attr):
        self._attr = attr

    @property
    def attr(self):
        return self._attr

    @attr.setter
    def attr(self,value):
        if self._attr != value:
            self._on_change()
        self._attr = value

    def _on_change(self):
        print "Do some code here every time attr changes"
Run Code Online (Sandbox Code Playgroud)

这非常有用:

>>> a = SomeClass(5)
>>> a.attr = 10
Do some code here every time attr changes
Run Code Online (Sandbox Code Playgroud)

但是如果我存储了一个可变对象attr,attr可以直接修改,绕过setter和我的更改检测代码:

class Container(object):
    def __init__(self,data):
        self.data = data

>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
>>>
Run Code Online (Sandbox Code Playgroud)

让我们假设它attr只会用于存储类型的对象Container.是否有修改一个优雅的方式SomeClass和/或 …

python

13
推荐指数
2
解决办法
3461
查看次数

Pythonic测试行是否在数组中的方法

这似乎是一个简单的问题,但我找不到一个好的答案.

我正在寻找一种pythonic方法来测试2d numpy数组是否包含给定行.例如:

myarray = numpy.array([[0,1],
                       [2,3],
                       [4,5]])

myrow1 = numpy.array([2,3])
myrow2 = numpy.array([2,5])
myrow3 = numpy.array([0,3])
myrow4 = numpy.array([6,7])
Run Code Online (Sandbox Code Playgroud)

给定myarray,我想编写一个函数,如果我测试myrow1则返回True,如果我测试myrow2,myrow3和myrow4则返回False.

我尝试了"in"关键字,它没有给我我预期的结果:

>>> myrow1 in myarray
True
>>> myrow2 in myarray
True
>>> myrow3 in myarray
True
>>> myrow4 in myarray
False
Run Code Online (Sandbox Code Playgroud)

它似乎只检查一个或多个元素是否相同,而不是所有元素都相同.有人可以解释为什么会这样吗?

我可以逐个元素执行此测试,如下所示:

def test_for_row(array,row):
    numpy.any(numpy.logical_and(array[:,0]==row[0],array[:,1]==row[1]))
Run Code Online (Sandbox Code Playgroud)

但这并不是非常pythonic,如果行有很多元素会变得有问题.必须有一个更优雅的解决方案.任何帮助表示赞赏!

python arrays testing numpy

12
推荐指数
2
解决办法
4588
查看次数

Python属性作为实例属性

我正在尝试编写一个具有动态属性的类.考虑以下具有两个只读属性的类:

class Monster(object):
    def __init__(self,color,has_fur):
        self._color = color
        self._has_fur = has_fur

    @property
    def color(self): return self._color

    @property
    def has_fur(self): return self._has_fur
Run Code Online (Sandbox Code Playgroud)

我想概括这一点,以便__init__可以使用任意字典并从字典中的每个项创建只读属性.我可以这样做:

class Monster2(object):
    def __init__(self,traits):
        self._traits = traits

        for key,value in traits.iteritems():
            setattr(self.__class__,key,property(lambda self,key=key: self._traits[key]))
Run Code Online (Sandbox Code Playgroud)

但是,这有一个严重的缺点:每次我创建一个新实例时Monster,我实际上是在修改Monster类.Monster我没有为我的新实例创建属性,而是有效地向所有实例添加属性Monster.看到这个:

>>> hasattr(Monster2,"height")
False
>>> hasattr(Monster2,"has_claws")
False
>>> blue_monster = Monster2({"height":4.3,"color":"blue"})
>>> hasattr(Monster2,"height")
True
>>> hasattr(Monster2,"has_claws")
False
>>> red_monster = Monster2({"color":"red","has_claws":True})
>>> hasattr(Monster2,"height")
True
>>> hasattr(Monster2,"has_claws")
True
Run Code Online (Sandbox Code Playgroud)

这当然是有道理的,因为我明确地将属性添加为类属性setattr(self.__class__,key,property(lambda self,key=key: self._traits[key])).我需要的是可以添加到实例的属性.(即"实例属性").不幸的是,根据我阅读和尝试的所有内容,属性始终是类属性,而不是实例属性.例如,这不起作用: …

python properties

4
推荐指数
1
解决办法
394
查看次数

为什么不能挑选作为对象属性的列表?

我试图挑选一个自定义类的实例,这个类有一个名为"widgets"的属性,它包含一个widget对象列表.当我腌制我的容器时,列表就丢失了.是不是可以在对象中挑选一个列表?

import pickle

filename = 'container.pkl'

class Container(object):
    widgets = []

class Widget(object):
    pass

c = Container()
c.name = "My Container"

w = Widget()
w.name = "My Widget"

c.widgets.append(w)

data = open(filename, 'wb')
pickle.dump(c, data)
data.close()
Run Code Online (Sandbox Code Playgroud)

后来我试着破坏...

# assume I have imported the classes and filename here

data = open(filename, 'rb')
container = pickle.load(data)
data.close()


print container.name # shows the pickled name
print container.widgets # shows []
Run Code Online (Sandbox Code Playgroud)

我尝试了pickle和cPickle同样的结果.

python pickle python-2.7

0
推荐指数
1
解决办法
2374
查看次数

标签 统计

python ×5

numpy ×2

arrays ×1

pickle ×1

properties ×1

python-2.7 ×1

testing ×1