小编MSe*_*ert的帖子

是否可以声明一个类变量,它将产生两个其他类变量的总和

class my_class(object):
    def __init__(self):
        self.ref        = 0
        self.ask        = 0
        self.added      = self.ref + self.ask 

inst = my_class()
inst.ref   = 5
inst.ask   = 7
print(inst.ref + inst.ask)
print(inst.added)
Run Code Online (Sandbox Code Playgroud)

我想print(inst.added)返回12但它返回0

python oop

3
推荐指数
1
解决办法
56
查看次数

删除列表中与大多数条目长度不同的元素

我知道如果列表中的元素没有特定的大小,如何删除它:

x = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2],[1,2,3],[1,2,3],[1,2,3,4]]
y = [s for s in x if len(s) == len(x[0])]
Run Code Online (Sandbox Code Playgroud)

x原始列表在哪里,y是新列表.正如你在第一个中看到的那样,有一个条目不像其他条目那么长,而一个条目比其他条目长.

我想删除一个元素,每次它与列表中的大多数元素的长度不同.只要列表中的第一个元素与大多数元素具有相同的长度,显示的方法就可以工作.

所以问题是如何获得最常见的元素长度?没有循环迭代的长度.平均值不起作用,因为平均值不代表大部分长度而是元素的平均长度(例如长度3,3,3,30将给出平均值~10,而长度的主要值为3).

python list

3
推荐指数
1
解决办法
78
查看次数

Python方法采用一个位置参数,但给出了两个

我遇到了一个我不太明白的错误.如果我有以下代码段:

class Test(object):
  def __init__(self):
    self.data = {}

  def update_data(self, **update):
    self.data = update

t = Test()

t.update_data(test='data') #  Works
t.update_data({'test':'data'}) #  TypeError: update_data() takes 1 positional argument but 2 were given
Run Code Online (Sandbox Code Playgroud)

所以根据我的理解,**update语法是字典破坏语法,当你将dict传递给函数时,它会被转换为关键字参数.

我在这里不正确地理解了什么?

python dictionary function keyword-argument

3
推荐指数
1
解决办法
1717
查看次数

访问python中的第n个维度

我想要一个易于读取访问多维numpy数组的某些部分.对于任何访问第一个维度的数组都是easy(b[index]).另一方面,访问第六维是"硬"(特别是阅读).

b[:,:,:,:,:,index] #the next person to read the code will have to count the :
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?特别是有一种方法,在编写程序时轴是不知道的吗?

编辑:索引维度不一定是最后一个维度

python arrays indexing numpy multidimensional-array

3
推荐指数
3
解决办法
167
查看次数

NumPy多维数组迭代如何工作?(有无nditer)

注意:我不确定这是否重复-请让我知道是否重复(并结束问题)。

如果有一个一维NumPy数组vector,则如果编写形式为以下形式的for循环:

for element in vector :
    print(element)
Run Code Online (Sandbox Code Playgroud)

结果将打印NumPy数组的每个元素。

如果有一个二维NumPy数组matrix,则如果编写一个for循环,其形式为:

for vector in matrix :
    print(vector)
Run Code Online (Sandbox Code Playgroud)

结果将打印二维NumPy数组的每一行,即它将打印一维NumPy数组,并且不会单独打印数组的每个元素。

但是,如果将for循环写为:

import numpy
for element in numpy.nditer(matrix) :
     print(element)
Run Code Online (Sandbox Code Playgroud)

结果打印二维NumPy数组的每个元素。

问题:如果拥有3维NumPy数组会发生什么tensor

一种。如果编写以下形式的for循环:

for unknownType in tensor :
     print(unknownType)
Run Code Online (Sandbox Code Playgroud)

这会打印出组成的二维NumPy(子)数组tensor吗?

即对于n维NumPy数组nArray,是否for unknownType in nArray :迭代组成n(N-1)维的NumPy(子)数组nArray

b。如果编写以下形式的for循环:

for unknownType in numpy.nditer(tensor) :
    print(unknownType)
Run Code Online (Sandbox Code Playgroud)

这会印出的元素tensor吗?还是会打印组成的二维二维NumPy(子)数组的组成一维NumPy(子)数组tensor

即对于n维NumPy数组nArray,是否for unknownType in …

python arrays for-loop numpy multidimensional-array

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

如果某个键不在some_dict中,为什么some_dict ['key'] = somevalue会起作用?

我知道我可以通过这样做在python dict中添加一个新的键/值

some_dict['absent_key'] = somevalue
Run Code Online (Sandbox Code Playgroud)

但我真的不了解内部工作.

我曾经认为字典表现得像C++地图.如果[]操作符不存在,则为给定键创建元素,然后返回对它的引用,以便可以在运算符的同一行中为其赋值=.

但是,C++中的这种行为的结果是,如果我们从映射中查询不存在的键的值,则会为该键创建该元素,并返回值类型的默认值而不是错误.在python中,这会抛出一个KeyError.

所以我不明白的是:如何,因为[]运算符必须=在python 之前进行评估(我认为?),它的行为会有所不同,这取决于结果是读取还是分配了一个值(它不应该在那里知道)表达式评价的要点)?

python评估表达式的顺序有区别吗?或者解释器只是更聪明,因为字典是一个硬编码类型,所以它更准确地知道它的行为,而std :: map是在'库'中,所以编译器可以假设更少?还是其他一些原因?

python dictionary operators

3
推荐指数
1
解决办法
103
查看次数

在条件中调用max的列表理解的大O:O(n)还是O(n ^ 2)?

问:编写一个返回数组中第二大数字的算法

a = [1, 2, 3, 4, 5]
print(max([x for x in a if x != max(a)]))
>> 4
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚这个算法是如何工作的,以及pythons内部魔术是否会使它像写一个线性算法一样高效,这个算法只是在列表上循环a一次并存储最高和第二高的值.

如我错了请纠正我:

  • 呼吁max(a)将是O(n)

  • [x for x in a] 也是O(n)

python是否足够智能来缓存值,max(a)或者这是否意味着算法的列表理解部分是O(n ^ 2)?

然后最终max([listcomp])将是另一个O(n),但这只会在理解完成后运行一次,所以最终算法将是O(n ^ 2)?

内部是否有任何花哨的业务会缓存该max(a)值并导致该算法的运行速度比O(n ^ 2)快?

python algorithm performance big-o list-comprehension

3
推荐指数
1
解决办法
718
查看次数

分配给值时的行为为何不一致?

考虑两个DataFrames d1d2:

d1 = pd.DataFrame(np.arange(2).reshape(-1, 2), columns=['A', 'B'])
d2 = pd.DataFrame(dict(A=[0], B=list('a')))
Run Code Online (Sandbox Code Playgroud)

我想覆盖第一列d1.它开始于:

d1

   A  B
0  0  1
Run Code Online (Sandbox Code Playgroud)

我试图覆盖以下的值'A':

d1.values[:, 0] = 2
d1

   A  B
0  2  1
Run Code Online (Sandbox Code Playgroud)

但是当我做同样的事情时d2,我会得到不同的结果.

d2

   A  B
0  0  a
Run Code Online (Sandbox Code Playgroud)

然后:

d2.values[:, 0] = 2
d2

   A  B
0  0  a
Run Code Online (Sandbox Code Playgroud)

没有什么改变,除非我这样做:

d2.A.values[:] = 2
d2

   A  B
0  2  a
Run Code Online (Sandbox Code Playgroud)

为什么这种行为不一致?

python numpy dataframe pandas

3
推荐指数
1
解决办法
76
查看次数

如果某些数据点是NaN,如何拟合二维函数?

我正在尝试将2D表面适合数据。更具体地说,我想找到一个将像素坐标映射到波长坐标的函数,就像FITCOORDS在IRAF中一样。

举例来说,我想test在以下代码片段中找到适合数组的内容:

import numpy as np
from astropy.modeling.models import Chebyshev2D
from astropy.modeling.fitting import LevMarLSQFitter
#%%
test = np.array([[7473, 7040, 6613, 6183, 5753, 5321, 4888],
   [7474, 7042, 6616, 6186, np.nan, 5325, 4893],
   [7476, 7044, 6619, 6189, 5759, 5328, 4897],
   [7479, 7047, np.nan, 6192, 5762, 5331, 4900]])
grid_pix, grid_wave = np.mgrid[:4, :7]
fitter = LevMarLSQFitter()
c2_init = Chebyshev2D(x_degree=3, y_degree=3)
c2_fit = fitter(c2_init, grid_wave, grid_pix, test)
print(c2_fit)
Run Code Online (Sandbox Code Playgroud)

ResultI 在Python 3.6 上astropy 2.0.2numpy 1.13.3以下:

Model: Chebyshev2D …
Run Code Online (Sandbox Code Playgroud)

python numpy missing-data model-fitting astropy

3
推荐指数
1
解决办法
134
查看次数

如何在numba编译函数中使用np.empty;错误消息“所有模板被拒绝”

当我尝试np.empty在用 numba 编译的函数定义中使用时遇到了这个奇怪的错误,并打开nopython=True以确保优化的输入有效。

这很奇怪,因为 numba 声称支持np.empty前两个参数,而我只使用前两个参数(我认为正确吗?),所以我不知道为什么它输入不正确。

@jit(nopython=True)
def empty():
    return np.empty(5, np.float)
Run Code Online (Sandbox Code Playgroud)

在 ipython notebook 中定义上述函数后,

empty()
Run Code Online (Sandbox Code Playgroud)

给出以下错误消息:

@jit(nopython=True)
def empty():
    return np.empty(5, np.float)
Run Code Online (Sandbox Code Playgroud)

python arrays numpy typing numba

3
推荐指数
1
解决办法
4167
查看次数