我正在帮助一家兽医诊所测量狗爪下的压力.我使用Python进行数据分析,现在我不得不试图将爪子分成(解剖学)子区域.
我制作了每个爪子的2D阵列,它由爪子随时间加载的每个传感器的最大值组成.这是一个爪子的例子,我用Excel绘制了我想要"检测"的区域.这些是传感器周围的2×2个盒子,具有局部最大值,它们一起具有最大的总和.
所以我尝试了一些实验并决定只查找每列和每行的最大值(由于爪子的形状,不能在一个方向上查看).这似乎可以很好地"检测"单独脚趾的位置,但它也标记了相邻的传感器.
那么告诉Python哪些最大值是我想要的最好的方法是什么?
注意:2x2正方形不能重叠,因为它们必须是单独的脚趾!
我也采用2x2作为方便,欢迎任何更高级的解决方案,但我只是一个人类运动科学家,所以我既不是真正的程序员也不是数学家,所以请保持"简单".
这是一个可以加载的版本np.loadtxt
所以我尝试了@jextee的解决方案(见下面的结果).正如你所看到的,它在前爪上很有效,但后腿的效果不太好.
更具体地说,它无法识别出第四个脚趾的小峰值.这显然是循环看起来自上而下朝向最低值的事实所固有的,而不考虑这是什么.
有谁知道如何调整@jextee的算法,以便它也可以找到第4个脚趾?
由于我还没有处理任何其他试验,我不能提供任何其他样品.但我之前提供的数据是每只爪子的平均值.该文件是一个数组,其最大数据为9个爪子,它们与盘子接触的顺序.
该图像显示了它们如何在空间上展开.
我已经为任何感兴趣的人建立了一个博客,我已经设置了一个包含所有原始测量值的SkyDrive.所以对于要求更多数据的人来说:给你更大的力量!
所以在我得到关于爪子检测和爪子分类的问题的帮助后,我终于能够检查每个爪子的脚趾检测!事实证明,除了像我自己的例子中那样大小的爪子之外,它在任何东西上都不能很好地工作.事后看来,任意选择2x2是我自己的错.
这是一个错误的例子:钉子被识别为脚趾,"脚跟"如此宽,它被识别两次!
爪子太大,因此在没有重叠的情况下采用2x2尺寸会导致一些脚趾被检测到两次.相反,在小型犬中,它经常无法找到第五个脚趾,我怀疑它是由2x2区域太大引起的.
在对我的所有测量结果进行了当前的解决方案之后,我得出了令人吃惊的结论:几乎所有的小型犬都没有找到第5个脚趾,并且对于大型犬的50%以上的影响它会发现更多!
显然我需要改变它.我自己的猜测是将neighborhood
小型狗的体型改为小型犬,大型犬则更大.但是generate_binary_structure
不会让我改变数组的大小.
因此,我希望其他人有更好的建议来定位脚趾,也许脚趾区域尺寸与爪子尺寸一致?
在我之前关于在每个爪子中发现脚趾的问题之后,我开始加载其他测量值以查看它将如何保持.不幸的是,我很快就遇到了上述步骤之一的问题:识别爪子.
你看,我的概念证明基本上是随着时间推移每个传感器的最大压力,并开始寻找每一行的总和,直到它找到!= 0.0.然后它对列进行相同的操作,一旦找到超过2行,再次为零.它将最小和最大行和列值存储到某个索引.
正如您在图中所看到的,这在大多数情况下都能很好地工作.但是,这种方法有许多缺点(除了非常原始):
人类可以拥有"空心脚",这意味着足迹内部有几排空行.因为我担心这种情况也会发生在(大)狗身上,所以在切断爪子之前,我等待至少2或3个空行.
如果在到达多个空行之前在另一列中创建另一个联系,则会产生问题,从而扩展该区域.我想我可以比较列,看看它们是否超过某个值,它们必须是单独的爪子.
当狗很小或走得更快时,问题会变得更糟.发生的事情是,前爪的脚趾仍在接触,而后爪的脚趾刚刚开始与前爪在同一区域内接触!
使用我的简单脚本,它将无法拆分这两个,因为它必须确定该区域的哪些帧属于哪个爪子,而目前我只需要查看所有帧的最大值.
它开始出错的例子:
所以现在我正在寻找一种更好的识别和分离爪子的方法(之后我将解决决定它是哪个爪子的问题!).
更新:
我一直在修补Joe的(真棒!)答案,但是我很难从我的文件中提取实际的爪子数据.
当应用于最大压力图像时,coded_paws显示了所有不同的爪子(见上文).但是,解决方案遍历每个帧(以分隔重叠的爪子)并设置四个Rectangle属性,例如坐标或高度/宽度.
我无法弄清楚如何获取这些属性并将它们存储在一些我可以应用于测量数据的变量中.因为我需要知道每个爪子,它在哪个框架中的位置是什么,并将它连接到哪个爪子(前/后,左/右).
那么如何使用Rectangles属性为每个爪子提取这些值呢?
我在我的公共Dropbox文件夹中的问题设置中使用了测量值(示例1,示例2,示例3).对于任何有兴趣的人我也建立了一个博客,让你保持最新:-)
我在以前的问题上有一些非常棒的帮助来检测爪子内的爪子和脚趾,但所有这些解决方案一次只能用于一次测量.
现在我有数据包含:
显然将所有内容都放在一个大对象上并不会削减它,所以我认为我需要使用类而不是当前的大量函数.但即使我已经阅读了学习Python关于类的章节,我也无法将其应用于我自己的代码(GitHub链接)
我还觉得每次想要获取一些信息时处理所有数据都很奇怪.一旦我知道每只爪子的位置,我就没有理由再次计算它.此外,我想比较同一只狗的所有爪子,以确定哪个接触属于哪个爪子(前/后,左/右).如果我继续只使用功能,这将变得一团糟.
所以现在我正在寻找关于如何创建类的建议,让我以合理的方式处理我的数据(链接到一条狗的压缩数据).
在我之前的问题中,我得到了一个很好的答案,帮助我检测到爪子撞到压板的位置,但现在我正在努力将这些结果与相应的爪子联系起来:
我手动注释了爪子(RF =右前方,RH =右后方,LF =左前方,LH =左后方).
正如您所看到的那样,显然有一种重复的模式,它几乎在每次测量中都会出现.这是一个手动注释的6个试验的演示链接.
我最初的想法是使用启发式方法进行排序,例如:
但是,我对我的启发式方法持怀疑态度,因为一旦遇到我没想过的变化,他们就会对我失败.他们也无法应对可能有自己规则的跛脚犬的测量结果.
此外,Joe提出的注释有时会搞砸,并没有考虑到爪子的实际外观.
基于我在关于爪子内峰值检测的问题上收到的答案,我希望有更先进的解决方案来对爪子进行分类.特别是因为每个单独的爪子的压力分布和其进展是不同的,几乎像指纹.我希望有一种方法可以使用它来聚集我的爪子,而不是按照发生的顺序对它们进行排序.
所以我正在寻找一种更好的方法来用相应的爪子对结果进行排序.
对于接受挑战的任何人,我挑选了一个包含所有切片阵列的字典,其中包含每个爪子的压力数据(通过测量捆绑)和描述其位置的切片(板上和时间上的位置).
为了澄清:walk_sliced_data是一个包含['ser_3','ser_2','sel_1','sel_2','ser_1','sel_3']的字典,它们是测量的名称.每个测量包含另一个字典,[0,1,2,3,4,5,6,7,8,9,10](例如来自'sel_1'),表示提取的影响.
另请注意,可以忽略"假"影响,例如部分测量爪子的位置(空间或时间).它们只是有用,因为它们可以帮助识别模式,但不会被分析.
对于任何有兴趣的人,我都会在博客上保留有关该项目的所有更新!
在另一个问题中,如果我可以提供我遇到问题的阵列,其他用户会提供一些帮助.但是,我甚至在基本的I/O任务中失败,例如将数组写入文件.
任何人都可以解释我需要将4x11x14 numpy数组写入文件需要什么样的循环?
这个数组包含四个11 x 14数组,所以我应该用一个漂亮的换行符来格式化它,以便在其他数据上更容易读取文件.
编辑:所以我尝试了numpy.savetxt函数.奇怪的是,它给出了以下错误:
TypeError: float argument required, not numpy.ndarray
Run Code Online (Sandbox Code Playgroud)
我假设这是因为该函数不适用于多维数组?我想在一个文件中找到任何解决方案吗?
在我之前的问题中,很多用户希望我给玩具提供更多数据.所以我开始导出所有数据并用Python处理它,但后来我意识到:我在哪里留下所有这些数据?
好吧我决定最好将它们放在数据库中,所以至少我不必每次都解析原始文件.但由于我对数据库一无所知,因此结果令人困惑.我尝试了一些教程来创建一个sqlite数据库,添加一个表和字段并尝试插入我的numpy.arrays,但它无法让它工作.
通常我的每条狗的结果看起来像这样:
所以我有35只不同的狗,每只狗有24个测量值.每个测量本身都有未知数量的联系人.每个测量由3D阵列(整个板的248帧[255x63])和2D阵列(板的每个传感器的最大值[255x63])组成.在数据库中存储一个值不是问题,但在那里获取我的2D数组似乎不起作用.
所以我的问题是如何在数据库中订购并将数组插入其中?
我正在尝试创建我的爪子数据的Matplotlib动画,在那里你可以看到整个压力板上的压力分布随着时间的推移(250x帧的256x64传感器).
我在Matplotlib自己的网站上找到了一个有效的例子,并设法让它处理我自己的数据.然而,'动画'非常慢,我不知道如何加快速度.
这是一个gif Joe Kington 在另一个答案中做出的一个例子,它是关于它显示的速度.考虑到测量是在125 Hz下进行的,这使得测量看起来非常慢.如果它以30-60 fps运行,它可以在4或8秒内运行,而不是当前的20+.
我不介意使用我需要的任何工具来完成工作,只要有一些好的文档来弄清楚如何做到这一点.
所以我的问题是:我怎样才能加快这些动画的速度?
我已经实现了Ignacio的建议来放入t.Start(1),但是当图如此大时它只能"正常"运行:
class PlotFigure(Frame):
""" This class draws a window and updates it with data from DataCollect
"""
def __init__(self):
Frame.__init__(self, None, -1, "Test embedded wxFigure")
#Varying the size of Figure has a big influence on the speed
self.fig = Figure((3,3), 75)
self.canvas = FigureCanvasWxAgg(self, -1, self.fig)
EVT_TIMER(self, TIMER_ID, self.onTimer)
def init_plot_data(self):
self.datagen = DataCollect(array3d)
self.axes = self.fig.add_subplot(111)
self.axes.imshow(self.datagen.next().T)
def …
Run Code Online (Sandbox Code Playgroud) 我正在关注斯坦福数据库课程,并且有一个问题,我们找到了所有的比萨饼,只使用关系代数为超过30岁的人们吃的每个比萨饼提供服务.
问题包括一个有四个关系的小型数据库:
Person(name, age, gender) // name is a key
Frequents(name, pizzeria) // [name,pizzeria] is a key
Eats(name, pizza) // [name,pizza] is a key
Serves(pizzeria, pizza, price) // [pizzeria,pizza] is a key
Run Code Online (Sandbox Code Playgroud)
我知道如何找到30多个披萨的人吃了它们并制作了它们的交叉产品,所以我可以检查哪个披萨店都有.
我可以列出所有比萨店供应那些披萨,但我不知道如何删除任何只有一个组合的比萨店(如多米诺).
Chicago Pizza cheese cheese
Chicago Pizza cheese supreme
Chicago Pizza supreme cheese
Chicago Pizza supreme supreme
Dominos cheese cheese
Dominos cheese supreme
Run Code Online (Sandbox Code Playgroud)
问答论坛告诉我们使用分部并指出我们的几个演示文稿.虽然我得到了动作的结果,但我并不真正理解如何将公式转换为关系代数语法.
任何人都可以向我解释我错过了什么,希望没有完全给出解决方案吗?
目前,如果我想比较狗的每只爪子下的压力,我只比较每个脚趾下面的压力.但我想尝试比较整个爪子下面的压力.
但要做到这一点,我必须旋转它们,所以脚趾重叠(更好).因为大多数时候左右爪子都在外面略微旋转,所以如果你不能简单地将一个爪子放在另一个上面.因此,我想旋转爪子,所以它们都以相同的方式对齐.
目前,我通过使用脚趾检测查找两个中间脚趾和后脚趾来计算旋转角度,然后计算黄线(脚趾绿色和红色之间的轴)和绿色线(中性轴)之间的角度. .
现在我想旋转阵列将围绕后脚趾旋转,使黄色和绿色线对齐.但是我该怎么做?
请注意,虽然这个图像只是2D(只有每个传感器的最大值),但我想在3D阵列上计算(平均10x10x50).我的角度计算的另一个缺点是它对脚趾检测非常敏感,所以如果有人在数学上有更正确的计算方法,那我就是耳朵.
我看过一项关于人体压力测量的研究,他们使用局部几何惯性轴方法,至少非常可靠.但这仍然无法解释如何旋转阵列!
如果有人觉得需要进行实验,这里有一个包含所有切片阵列的文件,其中包含每个爪子的压力数据.为了澄清:walk_sliced_data是一个包含['ser_3','ser_2','sel_1','sel_2','ser_1','sel_3']的字典,它们是测量的名称.每个测量包含另一个字典,[0,1,2,3,4,5,6,7,8,9,10](例如来自'sel_1'),表示提取的影响.
我正在尝试在Windows上 编译Python的Open Kinect驱动程序我用CMake(链接)创建了一个Make文件,并尝试用VC++ Express编译它.
除了Python包装器之外,所有内容似乎都可以正常编译(查看器示例正常工作).我更改了freenect的输出文件夹,它将freenect.lib放在另一个文件夹中以防止发生冲突.当我改变它并尝试编译cython_freenect时,我得到:
1>------ Build started: Project: ZERO_CHECK, Configuration: Release Win32 ------
2>------ Build started: Project: freenect, Configuration: Release Win32 ------
2> Creating library C:/IvoPython/Kinect/Driver/lib/Release/freenect.lib and object C:/IvoPython/Kinect/Driver/lib/Release/freenect.exp
2> freenect.vcxproj -> C:\IvoPython\Kinect\Driver\Release\freenect.dll
3>------ Build started: Project: freenect_sync, Configuration: Release Win32 ------
3> Creating library C:/IvoPython/Kinect/Driver/lib/Release/freenect_sync.lib and object C:/IvoPython/Kinect/Driver/lib/Release/freenect_sync.exp
3> freenect_sync.vcxproj -> C:\IvoPython\Kinect\Driver\Release\freenect_sync.dll
4>------ Build started: Project: cython_freenect, Configuration: Release Win32 ------
4>LINK : fatal error LNK1149: output filename matches input filename 'C:\IvoPython\Kinect\Driver\lib\Release\freenect.lib'
========== Build: …
Run Code Online (Sandbox Code Playgroud)