我正在尝试将多个2D数组(STAR)存储在一个可以继续增大的3D阵列(称为STACK)中。我需要STACK作为一个全局参数,可以随时由多个函数访问。为此,我尝试使用numpy.dstack()
到目前为止,这是我的代码:
box_size = np.shape(star)[0]
# The 2D array I'm trying to add to the STACK
STAR = [[1, 1, 1, 1, 1],\
[1, 1, 2, 1, 1],\
[1, 2, 3, 2, 1],\
[1, 1, 2, 1, 1],\
[1, 1, 1, 1, 1,]]
# Initialize STACK to be an empty array the same size as STAR
STACK = np.zeros((2*(box_size/2)+1,2*(box_size/2)+1))
# A function that appends STAR to STACK
def add_Star(STAR):
np.dstack((STACK,STAR))
# Call the function
add_Star(STAR)
然而,当我尝试打印更新的STACK时,我得到了
[[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]
我不知道我是否遗漏了一些明显或完全滥用该功能的东西。
要清楚,我希望STACK成为我添加的每一个STAR的记忆。也就是说,如果我需要,我希望每个STAR都能在STACK中访问,比如说以后删除它。在实践中,每个STAR都会有所不同,所以简单地将STACK添加到STAR是行不通的。
答案 0 :(得分:1)
这里似乎有一些混淆。
首先,以下代码应该按照您的意愿执行,并尽可能少地进行更改:
# The 2D array I'm trying to add to the STACK
STAR = [[1, 1, 1, 1, 1],\
[1, 1, 2, 1, 1],\
[1, 2, 3, 2, 1],\
[1, 1, 2, 1, 1],\
[1, 1, 1, 1, 1,]]
STAR = np.asarray(STAR)
# Initialize STACK to be an empty array the same size as STAR
STACK = np.zeros(STAR.shape, np.float_)
# A function that appends STAR to STACK
def add_Star(star):
out = np.dstack((STACK,star))
return out
# Call the function
STACK = add_Star(STAR)
现在让我们分解为什么。最重要的是,您的函数中的变量,例如
中的star
不要在代码中的其他地方使用相同的名称(实际上不应该这样,因为它令人困惑)。仅在函数调用中def add_Star(明星)
STACK = add_Star(STAR)
你需要为函数提供一些在别处定义的变量吗?
您会注意到我还添加了返回函数,因为我将您的问题解释为希望能够重复运行add_Star,并且每次都输出扩展的STACK。
此外,查看任何给定数组的尺寸的简单方法是
array.shape
您将看到我使用它来定义STACK的形状,而不是通过定义box_size的额外步骤。
最后,你所定义的STAR不是数组形式。使用numpy时,只需使用np.asarray即可获得类似于数组格式的列表。
答案 1 :(得分:0)
您可以使用@ModelAttribute("entity")
public Entity getEntity(@RequestParam(value="id", required=false) Long id) {
if (id == null) {
return new Entity();
} else {
Optional<Entity> entity = entityRepo.findById(id);
// TODO: Throw exception if not found (probably concurrently deleted).
return entity.orElse(null);
}
}
@RequestMapping(value="/entity/save", method=RequestMethod.POST)
public String postEdit(@Valid @ModelAttribute("entity") Entity entity, BindingResult bindingResult, @RequestParam(value = "version", required=false) Long version) {
if (entity.getVersion() != version) {
bindingResult.reject("concurrency", "The data was modified concurrently.");
}
if (bindingResult.hasErrors()) {
// TODO: Redisplay edit form
} else {
// TODO: Proceed with saving.
}
}
函数使用列表执行此操作:
append
这将打印:
STAR_1 = [[1, 1, 1, 1, 1],\
[1, 1, 2, 1, 1],\
[1, 2, 3, 2, 1],\
[1, 1, 2, 1, 1],\
[1, 1, 1, 1, 1,]]
STACK = [STAR_1]
STAR_2 = [[2, 2, 2, 2, 2],\
[1, 1, 2, 1, 1],\
[1, 2, 3, 2, 1],\
[1, 1, 2, 1, 1],\
[1, 1, 1, 1, 1,]]
STACK.append(STAR_2)
print(STACK)
答案 2 :(得分:0)
让我们简化您的行动,以便更好地了解正在发生的事情
In [125]: n=5
使用您的值
制作star
数组,5x5数组
In [126]: star=np.array([[1, 1, 1, 1, 1],\ # don't need the \
[1, 1, 2, 1, 1],\
[1, 2, 3, 2, 1],\
[1, 1, 2, 1, 1],\
[1, 1, 1, 1, 1,]])
In [127]: star
Out[127]:
array([[1, 1, 1, 1, 1],
[1, 1, 2, 1, 1],
[1, 2, 3, 2, 1],
[1, 1, 2, 1, 1],
[1, 1, 1, 1, 1]])
初始stack
为相同大小的零。这与“空”数组不同。
In [128]: stack=np.zeros((5,5))
In [130]: newstack=np.dstack((stack,star))
In [131]: newstack.shape
Out[131]: (5, 5, 2)
dstack
与列表追加不一样。它创建了一个新阵列。注意形状 - 3d。
In [132]: newstack
Out[132]:
array([[[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.]],
....
注意,它有零加星值。
In [133]: newstack=np.dstack((newstack,star))
In [134]: newstack.shape
Out[134]: (5, 5, 3)
你真的想这样做吗?
这是一种以增量方式构建3d数组的更好方法:
In [135]: alist=[]
In [136]: alist.append(star)
In [137]: alist.append(star)
In [138]: alist
Out[138]:
[array([[1, 1, 1, 1, 1],
[1, 1, 2, 1, 1],
[1, 2, 3, 2, 1],
[1, 1, 2, 1, 1],
[1, 1, 1, 1, 1]]), array([[1, 1, 1, 1, 1],
[1, 1, 2, 1, 1],
[1, 2, 3, 2, 1],
[1, 1, 2, 1, 1],
[1, 1, 1, 1, 1]])]
In [139]: np.array(alist)
Out[139]:
array([[[1, 1, 1, 1, 1],
[1, 1, 2, 1, 1],
[1, 2, 3, 2, 1],
[1, 1, 2, 1, 1],
[1, 1, 1, 1, 1]],
...)
In [140]: _.shape
Out[140]: (2, 5, 5)
请注意np.array
沿着新轴在前面连接组件。这是numpy
中更好的地方。
你提到以后删除'明星';如果将其保留在列表表单中会更容易。如果您需要跨'star'进行计算,则3d数组表单非常有用,但可能不需要。
或者,如果您知道自己拥有star
个stack
,则可以将In [146]: stack=np.zeros((2,5,5),dtype=int)
In [147]: stack[0,:,:] = star
In [148]: stack[1,:,:] = star*2
In [149]: stack
Out[149]:
array([[[1, 1, 1, 1, 1],
[1, 1, 2, 1, 1],
[1, 2, 3, 2, 1],
[1, 1, 2, 1, 1],
[1, 1, 1, 1, 1]],
[[2, 2, 2, 2, 2],
[2, 2, 4, 2, 2],
[2, 4, 6, 4, 2],
[2, 2, 4, 2, 2],
[2, 2, 2, 2, 2]]])
初始化为正确的尺寸,并指定值:
dstack
这也比重复使用setFetchMode()
(或其他一些连接)更好。