Python 交叉连接两个向量的元素以生成第三个向量
我有2个向量,希望将一个向量分布到另一个向量上,形成第三个向量,如:Python 交叉连接两个向量的元素以生成第三个向量,python,c++,r,vector,Python,C++,R,Vector,我有2个向量,希望将一个向量分布到另一个向量上,形成第三个向量,如: V1 = (a,b,c) V2 = (d,e,f) 结果: V3 = (ad,ae,af,bd,be,bf,...cf) 'nine total elements 我知道的唯一方法就是循环。我尝试了多种不同的方法来搜索,但找不到“一行代码”的解决方案,以避免循环 如果我错过了,请给我指一下。我可能没有找到正确的搜索参数 如果不可能的话,请不要让我难过,让我知道 如果有答案,请分享。在R: as.vector(sapply(
V1 = (a,b,c)
V2 = (d,e,f)
结果:
V3 = (ad,ae,af,bd,be,bf,...cf) 'nine total elements
我知道的唯一方法就是循环。我尝试了多种不同的方法来搜索,但找不到“一行代码”的解决方案,以避免循环
如果我错过了,请给我指一下。我可能没有找到正确的搜索参数
如果不可能的话,请不要让我难过,让我知道
如果有答案,请分享。在R:as.vector(sapply(V1,函数(x)paste0(x,V2))
在C++中:
std::vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
(在上测试。)
谢谢你,Rory Daulton,灵感来自。在C++中,我也可以这样做:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string operator*(const string &str1, const string &str2)
{
return str1 + str2;
}
template <typename ELEM>
ostream& operator << (ostream &out, const vector<ELEM> &vec)
{
const char *sep = "{ ";
for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
return out << " }";
}
int main()
{
vector<string> v1{ "a", "b", "c" }, v2{ "d", "e", "f" };
// in one line:
vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
// output:
cout << v3 << endl;
// done
return 0;
}
稍加改进后,它甚至可以用于混合类型:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string operator*(const string &arg1, int arg2)
{
string ret; for (int i = 0; i < arg2; ++i) ret += arg1;
return ret;
}
template <typename ELEM>
ostream& operator << (ostream &out, const vector<ELEM> &vec)
{
const char *sep = "{ ";
for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
return out << " }";
}
int main()
{
vector<string> v1{ "a", "b", "c" }; vector<int> v2{ 1, 2, 3 };
// in one line:
vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
// output:
cout << v3 << endl;
// done
return 0;
}
你没有弄清楚什么是运算
ab
的意思。我假设你想把两个实数相乘
在Python中,您可以使用理解。这里是完整的代码片段
v1 = (2, 3, 5)
v2 = (7, 11, 13)
v3 = tuple(x * y for x in v1 for y in v2)
然后,v3
的值为
(14, 22, 26, 21, 33, 39, 35, 55, 65)
如果您想要一个Python列表,代码看起来更简单:使用
v3 = [x * y for x in v1 for y in v2]
很明显,如何将操作更改为串联或任何其他所需操作。以下是字符串串联的示例代码:
v1 = ('a', 'b', 'c')
v2 = ('d', 'e', 'f')
v3 = tuple(x + y for x in v1 for y in v2)
导致
('ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf')
您还可以使用
itertools
模块中的product()但是上面的似乎更容易。请先选择一种特定的语言。ad
和其他语言是两个实数的乘法,两个字符串的串联,加入有序对,还是其他什么?考虑到,V3
实际上是V1
和V2
(如果矩阵是逐行存储的)并且假设元素是int
、float
或double
,您可以查看一下。对于Intels x86体系结构,它使用(或至少可以使用)它是用C++实现的,它对各种语言都有绑定,例如R和Python。谢谢你们的回答。我为我缺乏清晰性表示歉意,但是我应该更具体地说,这三个向量是需要级联的字符串。所以时间和精力并没有完全浪费。@ Migelk77我不理解“不是完全浪费”。道尔顿的Python解决方案确实提到了字符串的并列,以及C++中的并列(第二示例),即使你没有提到实际上是字符串的串接。(我甚至不会排除R中的解决方案,因为它可能依赖于函数(x)
的实际功能,但这只是猜测。)不,我的意思是,在我读帖子之前,我实际上已经弄明白了,所以我担心我浪费了你的时间问了一个我找到解决方案的问题。我讨厌问我应该已经知道或能够推理的问题。我刚开始写东西,知道最终我会扩展到python以外的其他语言,所以我很欣赏ted的答案超出了python的范围。很抱歉给你带来困惑,谢谢你的帮助。也很抱歉我忘了提到我在python中工作。我必须放慢速度,更多地关注细节。哈哈。我似乎无法克服角色缺陷。
(14, 22, 26, 21, 33, 39, 35, 55, 65)
v3 = [x * y for x in v1 for y in v2]
v1 = ('a', 'b', 'c')
v2 = ('d', 'e', 'f')
v3 = tuple(x + y for x in v1 for y in v2)
('ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf')