生成原始模式的子模式并引入零的生成器

2024-10-01 00:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的问题,我想用0生成模式。问题是这应该是节省空间的,因此我想使用一个生成器,一次创建并返回一个模式(即,我不想创建一个列表并返回它。)我在这里不知所措,因为我不知道我在调用生成器时做错了什么,所以任何帮助都将不胜感激!你知道吗

原始模式=[0。112.] 生成器应生成并返回以下内容:[0。012.], [0. 102.], [ 0. 110.]

但是,我可以通过调用生成器来生成其中一个模式(额外的1.0不是一个问题,只是为了不引起任何混乱……),而不是连续地生成所有模式。你知道吗

产生的子模式=(数组([0.,1.,0.,2.]),1.0)

以下是我的代码:

import numpy as np
def removeoneletter(subpattern):
     # generator = []
     originalpattern = subpattern
     subpatterncopy = subpattern.copy()
     nonzero = np.nonzero(subpattern)
     listnonzero = nonzero[0].tolist()
# only replace elements at nonzero positions with zero
     for i in listnonzero:
          subpatterncopy = subpattern.copy()
          position = i
          transaction = subpatterncopy[i]
          np.put(subpatterncopy, position, 0)
          print('subpattern generator')
          print(subpatterncopy)
          # generator.append((subpatterncopy, transaction))
          yield((subpatterncopy, transaction))
          if i == len(listnonzero):
              break

函数被另一个函数调用,如下所示:

def someotherfunction():

  combinations = removeoneletter(subpatterncopy)

  for x in combinations:
       # x = next(combinations)
       print('yielded subpattern')
       print(x)

Tags: infordefnp模式generatortransactionprint
1条回答
网友
1楼 · 发布于 2024-10-01 00:26:21

不是一个裸体专家,这部分在我看来有点奇怪:

for i in listnonzero:
    ....
    if i == len(listnonzero):
          break

for循环将listnonzero的元素分配给i,然后根据列表的长度进行测试。如果listnonzero有五个元素[5,42,6,77,12],并且您从列表中选择的第一个元素恰好是数字5,那么您将中断循环并在第一次迭代后退出。你知道吗

您的代码(可能)使用Javascript或类似的语言,其中“for i in something”将索引分配给i,而不是列表成员。你知道吗

如果这没有帮助,请尝试删除yield并在那里添加print语句,以查看您的listnonzero和i是否是您所期望的。你知道吗

只是一个想法。你知道吗

汉努

相关问题 更多 >